使用 PHP + MySQL Left Join 合并来自 2 个查询的结果

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

这就是我卡住的地方。我有两个 table 试图从中提取信息。一个 table 包含 idpost_title 列下感兴趣的数据,另一个包含 post_idmeta_keymeta_value 列下的数据.

我在 $in 中存储了一个数字数组,通过它我可以过滤来自两个 table 的数据。

从第一个 table 到 return idpost_title 很简单:

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

这当然是 return 一个名称和该名称的唯一 ID,例如:

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

不过,我还想获取与上面的 id returned 相关的价格,执行此操作的单个查询类似于:

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

我的问题是我希望能够通过一个查询而不是两个查询将所有这些数据 return 到一个数组中,这样 post_titlemeta_value 将对应于 $in 中的每个数字(比如 8),这样我就可以 return 查询一个数组,然后根据需要循环遍历该数组。老实说,我在这上面花了很多时间,我想我想做的事情需要 "LEFT JOIN",但是在看了多个视频和教程之后,我还是没能弄清楚如何让这种难以捉摸的技术发挥作用.谢谢您的帮助。 :)

如果联接的每一侧恰好有 1 行,则您要查找的是 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 table 有匹配记录的情况,您可以调整 JOIN 的性质

你会想要做一个看起来像这样的 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

您说得对,您可以使用 左连接。此查询将 return 加入 table。如果元 table 中没有与 post 匹配的行,$array['meta_value] 将是 null。如果有多行匹配,idpost_title 将被复制。

如果您事先知道每个 post 至少有一个元值,您可以改用 inner join

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