使用PHP + MySQL左连接来组合来自2个查询的结果

时间:2016-10-01 18:56:27

标签: php mysql left-join jointable

在这里,我被卡住了。我有两张表,我试图从中提取信息。一个表包含idpost_title列下感兴趣的数据,另一个表包含post_idmeta_keymeta_value列下的数据。

我有一个存储在$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),这将允许我将查询返回到数组,然后根据需要循环遍历该数组。老实说,我花了相当多的时间在这上面,我认为我要做的事情需要一个" LEFT JOIN",但经过多个视频和教程,我还没有弄清楚如何使这种难以捉摸的技术发挥作用。谢谢您的帮助。 :)

3 个答案:

答案 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'

但如果可能存在只有1个表具有匹配记录的情况

,则可以调整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

答案 2 :(得分: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