我正在尝试查询两个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
...返回与他们相关联的数字后缀的玩家。
如何在同一查询中将没有后元的玩家附加到结果中,以使所需结果看起来像这样?
| --- ** result ** ---- |
| ID | meta_value |
|-----------------------|
| 1 | 10 |
| 2 | 20 |
| 3 | null |
使用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
正如你可以看到在这个伟大的解释JOINS,LEFT JOIN
返回所有左表中的结果,并补充说,在右表,只要条件匹配的JOIN的信息。
至于INNER JOIN
,仅返回符合联接条件的结果
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句