2016-05-16 62 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