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


Using PHP + MySQL Left Join to combine results from 2 queries

这就是我被卡住的地方。我要从两个表中提取信息。一个表包含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",但是在多个视频和教程之后,我还没能弄清楚如何使这个难以捉摸的技术工作。谢谢你的帮助。:)

如果在join的每一侧都有一行,那么您正在寻找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的性质

您可以使用左连接,这是正确的。该查询将返回连接的表。如果元表中没有与文章匹配的行,则$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

您想要做的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

)过滤连接。