[英]SQL - ordering results from joined table
注意:此问题与WordPress特定问题有关,但我希望从纯SQL角度对此问题有一个“外在眼光”: https : //wordpress.stackexchange.com/questions/55263/order-posts-by -custom场和-IF-自定义字段,为空回,剩余职位
假设我们必须使用以下结构的表:
Tabe posts
: ID
(密钥), Title
表post_metadata
: post_ID
(FKEY), meta_key
和meta_value
我想检索具有以下内容的帖子的ID和标题:
post_metadata
具有key
='meta_1'和meta_value
='value_1'的条目 post_metadata
一个key
为'meta_2'和meta_value
='value_2'的条目 我想使用meta_key
=“ meta_3”通过第三个元数据的值对结果进行排序。
现在这是棘手的部分:
并非所有帖子都在post_metadata
表中具有“ meta_3”作为meta_key
。 由于我不是按meta_3过滤帖子,而是仅按顺序排序,因此我想将这些帖子保留在我的结果中,就好像它们对此meta具有空值一样。
我们如何实现这一目标?
谢谢
编辑:
现在有SQL提琴: https : //www.db-fiddle.com/f/kBNaaRFB5xfna5MniuTpaG/1
也许:
如果存在,请使用一次一次左联接获取meta 3值,以确保将具有meta1和meta2的所有帖子保留为期望值。 然后使用一个exist,并且必须确保您只获取同时具有期望值的meta1和2的记录。
未经测试...
SELECT P.ID, P.Title, PM.Meta_value
FROM Posts P
LEFT JOIN Post_MetaData PM
on P.ID = PM.Post_ID
and PM.key = 'meta_3'
WHERE exists (SELECT 1
FROM post_meta
WHERE ((Key 'meta_1' and meta_value = 'Value_1') OR
(Key 'meta_2' and meta_value = 'Value_2'))
and P.ID = Post_ID --Either here or an AND in the HAVING clause...need to test to know
GROUP BY Post_ID
HAVING count(*) = 2 )
ORDER BY -PM.meta_value desc, P.ID
这确实假定post_metaData对每个Post_ID的键都有唯一的约束。 否则我们可以得到值为a的meta_1和值为a的meta1,而count(*)为2; 并在结果中错误地返回它。
为确保最后一个空值,请遵循此方法; MySQL Orderby一个数字,Null为最后
作为一个IN ....来做,但是我想会慢一些。
SELECT P.ID, P.Title, PM.Meta_value
FROM Posts P
LEFT JOIN Post_MetaData PM
on P.ID = PM.Post_ID
and PM.key = 'meta_3'
WHERE P.ID in (SELECT Post_meta.Post_ID
FROM post_meta
WHERE ((Key 'meta_1' and meta_value = 'Value_1') OR
(Key 'meta_2' and meta_value = 'Value_2'))
GROUP BY Post_ID
HAVING count(*) = 2 )
ORDER BY -PM.meta_value desc, P.ID
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.