2016-10-01 113 views
1

這裏是我陷入困境的地方。我有兩個表,我試圖從中獲取信息。一個表格包含idpost_title列下感興趣的數據,另一個表格包含post_id,meta_keymeta_value列下的數據。使用PHP + MySQL左連接合並來自2個查詢的結果

我有一個數字存儲在$in,通過它我可以從兩個表中篩選數據。

要返回idpost_title從第一個表是一個簡單的:

$query = "SELECT id, post_title FROM wplz_posts WHERE id IN ($in)"; 

當然這會返回一個名稱,該名稱的唯一ID,例如:

[id] => 8 
[post_title] => Rustic Wooden Chair 

我然而也想要獲取與上面返回的id相關的價格,並且單個查詢要做到這一點看起來像這樣:

$query = "SELECT meta_value 
FROM wplz_postmeta 
WHERE post_id IN ($in) AND meta_key = '_price'"; 

我的問題是,我希望能夠將所有這些數據返回到一個查詢而不是兩個,這樣post_titlemeta_value將對應於$in中的每個單個數字(比如說,8),然後它將允許我將查詢返回給一個數組,然後根據需要遍歷該數組。老實說,我花了相當多的時間在這方面,我想我要做的事情需要一個「左加入」,但在多個視頻和教程後,我一直無法弄清楚如何使這種難以捉摸的技術工作。感謝您的幫助。 :)

+0

您的所有結果是否都有_price元鍵值?如果是這樣,一個'INNER JOIN'是最好的,否則'LEFT JOIN'可以工作,但看起來像需要額外的工作。 – Clay

回答

1

你想這樣做的INNER JOIN看起來像這樣:

$query = "SELECT p.id, p.post_title, pm.meta_value 
FROM wplz_posts p 
INNER JOIN wplz_postmeta pm ON pm.post_id=p.id 
WHERE p.id IN ($in) 
AND pm.meta_key = '_price'"; 

您需要加入idpost_id密鑰,但也要根據meta_key值過濾連接,該值爲_price

+0

這個工作,我會看看這個,直到我找出背後的邏輯......非常感謝! –

2

如果在連接的每一邊恰好有一排您正在尋找一個INNER JOIN而不是LEFT JOIN

SELECT id, post_title,meta_value FROM wplz_posts 
INNER JOIN wplz_postmeta 
ON wplz_postmeta.post_id=wplz_posts.id 
WHERE wplz_posts.id IN ($in) 
AND meta_key = '_price' 

但可以調整JOIN的性質,如果有可能的情況,其中只有1表中有匹配的記錄

2

你是對的,你可以使用左加入。該查詢將返回連接的表。如果元表中沒有與帖子匹配的行,則$array['meta_value]將爲null。如果有幾行匹配,idpost_title將被複制。

如果您事先知道每篇文章至少有一個元值,您可以使用內部連接來代替。

SELECT t1.id, t1.post_title, t2.meta_value 
FROM wplz_posts AS t1 
LEFT JOIN wplz_postmeta AS t2 ON t1.id = t2.post_id