注意:这个问题与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
(键), Title
表 post_metadata
: post_ID
(fkey公司), meta_key
, meta_value
我想检索具有以下内容的帖子的id和标题:
进入 post_metadata
与 key
='元1'和 meta_value
='值\u 1'
还有一个条目 post_metadata
与 key
='元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
1条答案
按热度按时间xvw2m8pv1#
也许:
使用左连接一次以获取meta3值(如果存在),确保所有包含meta1和meta2的文章都具有所需的值。然后使用exist和having来确保只获得同时具有meta1和meta2的记录,并且这些记录都具有所需的值。
未经测试。。。
这确实假设post\u元数据对每个post\u id的键有唯一的约束,否则我们可以得到值为a的meta\u 1和值为a的meta1,计数(*)将是2;并在结果中错误地返回它。
为确保空值是最后一个,请遵循此方法;mysql orderby一个数字,最后为空
做这件事是为了。。。。但我想会慢一点。