我有一个带有左连接的SQL查询,工作得很好。但是,我在订购结果时遇到了困难。
查询如下所示:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID FROM wp_posts INNER JOIN wp_postmeta ON ( wp_posts.ID = wp_postmeta.post_id ) LEFT OUTER JOIN wp_posts recent ON recent.post_parent = wp_posts.ID AND recent.post_type = 'ticket_reply' AND recent.post_author = wp_posts.post_author WHERE 1=1 AND ( ( wp_postmeta.meta_key = '_wpas_status' AND CAST(wp_postmeta.meta_value AS CHAR) = 'open' ) ) AND wp_posts.post_type = 'ticket' GROUP BY wp_posts.ID ORDER BY CASE WHEN recent.post_parent IS NULL THEN 0 ELSE 1 END, recent.post_date DESC, wp_posts.post_date DESC LIMIT 0, 20
查询工作正常,并按日期正确排序。
但是,最后显示交叉点中的条目(即ticket
类型的帖子没有ticket_reply
个孩子)。我需要先显示那些,然后按原始查询中显示的日期显示其余部分。
我不确定这个请求是否足够清楚。如果没有,请告诉我需要澄清的内容,我会尽力澄清。
答案 0 :(得分:3)
试试这个:
SELECT SQL_CALC_FOUND_ROWS wp_posts.ID
FROM wp_posts
LEFT OUTER JOIN wp_posts recent
ON recent.post_parent = wp_posts.ID AND
recent.post_type = 'ticket_reply' AND
recent.post_author = wp_posts.post_author
WHERE 1=1 AND wp_posts.post_type = 'ticket'
GROUP BY wp_posts.ID
ORDER BY CASE WHEN recent.post_parent IS NULL THEN 0 ELSE 1 END,
recent.post_date ASC,
wp_posts.post_date DESC
LIMIT 0, 20
此谓词recent.post_parent IS NULL
标识不匹配的记录。 CASE
表达式为这些记录返回0
值,为其余记录返回1
。因此,这种方式首先显示不匹配的记录,然后显示其余记录。