这发生在WordPress内部,但这是一个一般的MySQL问题。
有两个表,其中一个包含posts,另一个通过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我试图对某些列值进行排序,这些结果可能不是为所有行设置的。基本上,我希望先设置列/值对的行,然后是所有其他行。每个帖子都可能有一些元数据,基于meta_key和meta_value对。一个帖子可能有更多的键,它们不需要包含我想要分类的键。
问题是,使用MySQL查询和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'第二步:如何选择不存在此meta_key的所有行?
我的意思是,但这可能是个糟糕的解决方案:
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'
)第三步:显示组合结果。这可能是上述两个查询的UNION。
我相信一定有更好的治疗方法。更重要的是,我不知道如何指定额外的参数--例如,首先找到所有带有给定元键、标题或类别等的帖子,然后按照上面的布局按said mykey排序。
最终编辑
如果有人感兴趣,以下是上下文中的最后解决方案。RedFilter的回答使它成为可能,再次感谢.
SELECT p1.ID, p1.post_title, p1.post_type, p1.post_date, m1.meta_value AS meta1, meta2
FROM wp_posts AS p1
LEFT JOIN wp_postmeta AS m1 ON m1.post_id = p1.ID
LEFT JOIN wp_term_relationships AS tr0 ON tr0.object_id = p1.ID
LEFT JOIN wp_term_taxonomy AS tt0 ON tr0.term_taxonomy_id = tt0.term_taxonomy_id
LEFT JOIN wp_terms AS t0 ON tt0.term_id = t0.term_id
LEFT JOIN
(
SELECT
p.ID, IF (m.meta_value = 'on', 1, 0) AS meta2
FROM wp_posts AS p
LEFT JOIN wp_postmeta AS m
ON p.ID = m.post_id
and m.meta_key = 'mykey'
) as extra
ON extra.ID = p1.ID
WHERE 1 = 1
AND m1.meta_key = 'some-other-meta-key'
AND p1.post_type IN ('post', 'some-custom-post-type')
AND tt0.taxonomy = 'some-taxonomy'
AND t0.term_id = 'some-id'
ORDER BY meta2 DESC, meta1 ASC, p1.post_date DESC发布于 2013-11-07 14:40:02
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'https://stackoverflow.com/questions/19838540
复制相似问题