2015-12-21 65 views
-3

我有2個表格:ticketticket_messageORDER BY不工作內部JOIN SELECT

我想選擇所有未由我們的支持團隊回答的門票。這意味着留在票證中的最後一條消息將具有類型client

我想這樣的代碼:

SELECT `ticket`.*,`message`.* 
FROM `ticket` 
LEFT JOIN (SELECT * FROM `ticket_message` ORDER BY `timeCreated` DESC) AS `message` ON `message`.`ticketId` = `ticket`.`id` 
GROUP BY `ticket`.`id` 
HAVING `message`.`type` = 'client' 

的事情是,這個代碼工作完美地與MySQL的42年5月5日我的dev的服務器上,但消息並沒有在子查詢與MySQL 5.7排序生產服務器上。 9

這裏是EXPLAIN結果:

爲42年5月5日:

id select_type table type  possible_keys key key_len ref rows Extra 
1 PRIMARY  ticket   ALL   NULL NULL  NULL NULL 38 
1 PRIMARY  <derived2>  ALL   NULL NULL  NULL NULL 130 
2 DERIVED  ticket_message ALL   NULL NULL  NULL NULL 127 Using filesort 

爲5.7.9:

id select_type table   partitions type possible_keys      key     key_len ref  rows filtered Extra 
1 SIMPLE  ticket   NULL  index PRIMARY,ticket_ibfk_1,ticket_ibfk_2 PRIMARY    4  NULL  38  100.00 NULL 
1 SIMPLE  ticket_message NULL  ref ticket_message_ibfk_1    ticket_message_ibfk_1 5  ticket.id 3  100.00 NULL 
+0

爲什麼你不只是'LEFT JOIN ticket_message'?你想得到什麼結果?另外,你期望'ORDER BY timeCreated'做什麼? –

+1

同樣對於你的查詢,這個'ORDER BY \'timeCreated \'DESC'完全不需要,實際上它會增加計劃。 –

+2

在此查詢的連接內進行排序沒有意義。只需在聯接後對結果進行排序即可。 –

回答

0

有沒有保證的子查詢中的排序將被保留。在這種情況下,您可以使用連接而不是子查詢。

這是行不通的?

SELECT `ticket`.*,`ticket_message`.* FROM `ticket` 
LEFT JOIN `ticket_message` ON `ticket_message`.`ticketId` = `ticket`.`id` 
GROUP BY `ticket`.`id` ORDER BY `ticket_message`.`timeCreated` DESC 

我不知道你想達到什麼,但你可以把它放到ticket_messagetimeCreated進入組或者您可能會收到意想不到的結果。

使用「GROUP BY」注

這是很容易使用組通過陷入出來,也有應該遵循

字段您選擇應該出現在「分組依據」條款規則。如果它們不在group by子句中,則應該應用聚合函數。

https://mariadb.com/kb/en/sql-99/rules-for-grouping-columns/

+0

從解釋中可以明顯看出,v5.7優化了子查詢,因爲那裏沒有派生表,而5.5在寫入時執行查詢。這似乎是排序有所不同的原因。 – Shadow

+0

+1開幕詞。 -2表示在沒有任何聚合函數的情況下使用GROUP BY子句的內容。 – Strawberry

+0

@Shadow是的。你知道有什麼辦法擺脫這種優化? –