尽管其他表连接两个表的SQL查询可能没有值

时间:2013-12-05 15:30:45

标签: mysql wordpress

我正在尝试查询两个Wordpress表,即。 postspostmeta

基本上我感兴趣的表和行看起来像这样:

| ---- ** 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       |

2 个答案:

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