2016-05-16 64 views
1

我有一个左连接的SQL查询,工作得很好。但是,我在订购结果时遇到困难。如何通过左连接命令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子代的帖子)。我需要先显示这些内容,然后按原始查询中显示的日期显示其余内容。

我不确定这个请求是否足够清楚。如果没有,请让我知道需要澄清什么,我会尽我所能澄清。

回答

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。因此,这种方式不匹配的记录将首先显示,然后是其余的记录。

+0

不幸的是,这并没有改变顺序。但是,我意识到我可能会留下原始查询的重要信息:添加了第一个内部联接。也许这会改变'ORDER BY'行为。 我编辑了原始的SQL查询。 – Julien

+0

@Julien您可以发布一些示例数据,以便我们能够重现此问题吗? –

+0

我不确定究竟是什么样的最佳数据分享。这是我的wp_posts表的转储。它来自我的开发环境,所以它可能会有一些愚蠢的东西。 http://jmp.sh/AZyzf09 这个想法是让门票先没有回复(“我的第三张票”和“我的第一张票”),然后是“我的第二张票”,它有回复。 – Julien