MySQL:从第二个表按值排序,如果未设置值,则使用默认值

时间:2013-11-07 14:33:40

标签: mysql wordpress join subquery union

这发生在WordPress中,但这是一个普遍的MySQL问题。

有两个表,其中一个包含帖子,其他元数据按ID链接。

post_title | ID     post_id | meta_key | meta_value
-----------+---     --------+----------+-----------
title      | 1      1       | key_1    | aaa
-----------+---     --------+----------+-----------
title      | 2      1       | key_2    | bbb
                    --------+----------+-----------
                    1       | mykey    | 1
                    --------+----------+-----------
                    2       | key_n    | ccc ddd

我正在尝试在某些列值上排序结果,这可能不会为所有行设置。基本上,我希望首先看到具有此列/值对的行,然后是所有其他行。根据{{​​1}}和meta_key对,每封帖子可能包含一些与之关联的元数据。单个帖子可能有更多的键,它们不需要包含我想要排序的键。

问题是使用带有meta_value的MySQL查询将排除此密钥不存在的所有帖子。所以我需要的是一种显示所有帖子的默认值的方法,其中这个元键不存在。

第一步:可以轻松选择具有特定meta_key的所有行:

WHERE meta_key = mykey

第二步:如何选择此meta_key不存在的所有行?

这就是我的意思,但这可能是一个糟糕的解决方案:

SELECT
    p.ID, p.post_title, p.post_type, p.post_date, m.meta_value
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS m ON p.ID = m.post_id 
WHERE
    m.meta_key = 'mykey'

第三步:显示合并结果。这可能是上述两个查询的SELECT p.ID, p.post_title, p.post_type, p.post_date, "some_default" FROM wp_posts AS p WHERE p.ID NOT IN ( SELECT p.ID FROM wp_posts AS p LEFT JOIN wp_postmeta AS m ON p.ID = m.post_id WHERE m.meta_key = 'mykey' )

我确信必须有更好的结果。更重要的是,我不知道如何指定其他参数 - e。例如,首先查找包含某个元键,标题或类别等的所有帖子,然后按照上面列出的UNION进行排序。

最终编辑

如果有人有兴趣,这里是上下文中的最终解决方案。 RedFilter的答案使它成为可能,再次感谢。

mykey

1 个答案:

答案 0 :(得分:2)

SELECT p.ID, p.post_title, p.post_type, p.post_date, 
    ifnull(m.meta_value, 'default val') as meta_value
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS m ON p.ID = m.post_id 
    and m.meta_key = 'mykey'