这发生在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
答案 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'