sql-joined表的排序结果

cidc1ykv  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(212)

注意:这个问题与wordpress特定的问题有关,但我想从纯sql的Angular “从外部看”这个问题:https://wordpress.stackexchange.com/questions/55263/order-posts-by-custom-field-and-if-custom-field-is-empty-return-remaining-posts
假设我们必须使用以下结构的表:
泰伯 posts : ID (键), Titlepost_metadata : post_ID (fkey公司), meta_key , meta_value 我想检索具有以下内容的帖子的id和标题:
进入 post_metadatakey ='元1'和 meta_value ='值\u 1'
还有一个条目 post_metadatakey ='元2'和 meta_value ='值2'
我想用第三个元数据的值对结果进行排序 meta_key =“元3”。
下面是棘手的部分:
不是所有的帖子都有一个条目 post_metadata 带有“meta_3”的表 meta_key . 因为我不是按meta_3过滤帖子,只是排序,所以我想把这些帖子保留在我的结果中,就好像它们对这个meta有一个空值一样。
我们怎样才能做到这一点?
谢谢
编辑:
现在有了sql fiddle:https://www.db-fiddle.com/f/kbnaarfb5xfna5mniutpag/1

8hhllhi2

8hhllhi21#

也许:
使用左连接一次以获取meta3值(如果存在),确保所有包含meta1和meta2的文章都具有所需的值。然后使用exist和having来确保只获得同时具有meta1和meta2的记录,并且这些记录都具有所需的值。
未经测试。。。

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\u元数据对每个post\u id的键有唯一的约束,否则我们可以得到值为a的meta\u 1和值为a的meta1,计数(*)将是2;并在结果中错误地返回它。
为确保空值是最后一个,请遵循此方法;mysql orderby一个数字,最后为空
做这件事是为了。。。。但我想会慢一点。

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

相关问题