繁体   English   中英

SQL-从联接表排序结果

[英]SQL - ordering results from joined table

注意:此问题与WordPress特定问题有关,但我希望从纯SQL角度对此问题有一个“外在眼光”: https : //wordpress.stackexchange.com/questions/55263/order-posts-by -custom场和-IF-自定义字段,为空回,剩余职位

假设我们必须使用以下结构的表:

Tabe postsID (密钥), Title

post_metadatapost_ID (FKEY), meta_keymeta_value

我想检索具有以下内容的帖子的ID和标题:

  • post_metadata具有key ='meta_1'和meta_value ='value_1'的条目
  • AND 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM