我正在尝试查询两个Wordpress表,即。 posts
和postmeta
。
基本上我感兴趣的表和行看起来像这样:
| ---- ** posts ** ---- | | -------- ** postmeta ** ---------- |
| ID | post_type | | post_id | meta_key | meta_value |
|-----------------------| |------------------------------------|
| 1 | player | | 1 | number | 10 |
| 2 | player | | 2 | number | 20 |
| 3 | player | | 3 | othre_key | aaa |
| 4 | other_type | | 4 | other_key | xxx |
| 4 | other_type | | 5 | other_key | yyy |
| 4 | other_type | | 6 | other_key | zzz |
我希望将所有帖子设为post_type = player
,并按postmeta.meta_value
排序,postmeta.meta_key = number
是否存在postmeta
行。
SELECT a.ID, a.post_title, b.meta_value, b.meta_key
FROM $wpdb->posts AS a
INNER JOIN $wpdb->postmeta AS b
ON a.ID = b.post_id
AND b.meta_key = %s
WHERE a.post_status = %s
AND a.post_type = %s
GROUP BY a.ID
ORDER BY b.meta_value+(0) ASC, a.post_title ASC
...返回与其关联的数字postmeta的玩家。
如何将没有该postmeta的玩家附加到同一查询中的结果中,以便所需的结果看起来像这样?
| --- ** result ** ---- |
| ID | meta_value |
|-----------------------|
| 1 | 10 |
| 2 | 20 |
| 3 | null |
答案 0 :(得分:3)
使用LEFT JOIN
代替INNER JOIN
:
SELECT a.ID, a.post_title, b.meta_value, b.meta_key
FROM $wpdb->posts AS a
LEFT JOIN $wpdb->postmeta AS b
ON a.ID = b.post_id
AND b.meta_key = %s
WHERE a.post_status = %s
AND a.post_type = %s
GROUP BY a.ID
ORDER BY b.meta_value+(0) ASC, a.post_title ASC
正如您在this great explanation of JOINS中看到的那样,LEFT JOIN
会返回LEFT表中的所有结果,并在JOIN条件匹配时添加RIGHT表中的信息。
对于INNER JOIN
,仅返回与连接条件匹配的结果
答案 1 :(得分:0)
正如Filipe所说,你想使用LEFT JOIN。
左连接大部分与内连接相同。它根据规范将所有匹配的记录放在一起。
不同之处在于,LEFT表中的所有记录(您在连接运算符之前编写的表)也将在查询结果中返回。
右表字段中的所有值都将设置为NULL。
此外,要仅从左表中获取与右表不匹配的行,可以添加b.post_id IS NULL。
SELECT a.ID, a.post_title, b.meta_value, b.meta_key
FROM $wpdb->posts AS a
LEFT JOIN $wpdb->postmeta AS b
ON a.ID = b.post_id
AND b.meta_key = %s
WHERE a.post_status = %s
AND a.post_type = %s
GROUP BY a.ID
ORDER BY b.meta_value+(0) ASC, a.post_title ASC