2017-10-18 110 views
0

感謝您閱讀我的問題。我一直在這裏待了一天半,現在看來我無法得到這個工作。我想要做的是結合兩個SQL查詢。結合兩個SQL查詢PHP

與數據庫的連接正確設置。這一切都工作。所以我想結合的查詢是:

$sql = "SELECT * FROM pf_postmeta WHERE meta_key = '_wp_attached_file' "; 
$result = $conn->query($sql); 
foreach ($result as $row) { 
     // do my stuff 
    } 
$conn->close(); 

而且

$sql = "SELECT * FROM pf_posts WHERE post_type = 'cases' "; 
$result = $conn->query($sql); 
foreach ($result as $row) { 
     // do my stuff 
    } 
$conn->close(); 

現在,我讀過有關JOINUNION,但我不能讓這兩個查詢一起工作。

我試過用UNION ALL無濟於事。

$sql = "SELECT *FROM pf_postmeta WHERE meta_key = '_wp_attached_file' 
     UNION ALL 
     SELECT *FROM pf_posts WHERE post_type = 'cases'"; 
$result = $conn->query($sql); 
foreach ($result as $row) { 
     // do stuff 
    } 
$conn->close(); 

這沒有顯示任何內容。

根據要求更新:如果我刪除了UNION ALL SELECT部分,我的查詢就可以工作。如果我在MySQLWorkbench運行此代碼它說的

09:07:30 SELECT * FROM deb100651n2_pf.pf_posts WHERE post_type='cases' UNION ALL SELECT * FROM deb100651n2_pf.pf_postmeta WHERE meta_key = '_wp_attached_file' Error Code: 1222. The used SELECT statements have a different number of columns 0.050 sec

有沒有人誰的解決方案形成了我?這已被竊聽我過去1,5天的...

(注:我是很新,整個SQL的事情,所以請溫柔...)

再次感謝您的時間...

+0

您是否檢查了錯誤輸出以查看UNION查詢給您的錯誤?那將是一個開始的好地方。 –

+0

你能告訴我如何獲得調試「輸出」?我很樂意更新這個問題。 –

+0

而不是在PHP中運行它們,您可能會更好地在MySQL Workbench或PHPMyAdmin中運行它們,以便查看是否有任何錯誤。沒有看到您的模式,我們無法真正幫助您。 JOIN只會在兩個表之間存在關係時才起作用 – Alex

回答

3

要執行「聯合查詢」 列的數目必須匹配,數據類型每列必須是相容的(例如第一查詢的列3是小數,且將列第二個查詢的3是整數)。如果列數不同,或者任何列是不兼容的類型,則查詢將產生SQL錯誤。

所以。這是停止在任何生產代碼中使用select *的一個非常重要的原因。您必須指定列名稱,確保兩個選擇列表具有相同數量的列,並且這些列是兼容的。

+0

現在你的問題解決了嗎?你仍然有關於這個答案的問題嗎?要接受答案「[**點擊Tick **](https://ibb.co/ikqyO6)」以獲取更多信息,請參閱[help/accepting](https://stackoverflow.com/help/someone-answers) –

-4

爲什麼使這麼複雜使其變得簡單。試試看:

SELECT * FROM pf_postmeta 
WHERE meta_key = '_wp_attached_file' 
UNION 
SELECT * FROM pf_posts 
WHERE post_type = 'cases' 
+0

UNION不解決這個問題。 UNION ALL完全有效。不好的是使用'select *',這就是列數不同的原因。頂部選擇具有!=到底部選擇的列。 (注意:順便提一下,UNION ALL更快。) –

1

至於我從你上面陳述的內容中猜出在你的聯合查詢中可能存在列未命中匹配問題。當使用union運營商必須記住三東西 -

  • 內UNION每個SELECT語句必須有相同的列數
  • 列也必須有類似的數據類型
  • 列在每個SELECT聲明中還必須在同一順序

因此,如果兩個表那麼你pf_postmetapf_post表必須H於執行SELECT * ..操作相同數量的列具有相似的數據類型和排序。你可以嘗試SELECT id from pf_postmeta UNION ALL SELECT id from pf_post清除你的概念如何工會工作假設有id列在這兩個表。

+0

這聽起來合乎邏輯。即使身份證不一樣,這項工作是否還會繼續? 'fp_postmeta'具有'meta_id','fp_posts'具有'ID'。它們必須匹配行名嗎? –

+0

是的。 'union'從合併表中提取所有行。像兩套代數「聯盟」一樣思考。如果設置了「a = {1,2}」並設置了「b = {5,6}」,那麼「聯合b = {1,2,5,6}'。 只要列的數據類型相同,該列的名稱就不能相同。欲瞭解更多詳情,請訪問此鏈接 - https://www.w3schools.com/sql/sql_union.asp 希望有所幫助。 –

+0

所以,如果他們不匹配,我不能使用'union'。那麼,回到我認爲的繪圖板。並以其他方式做... –