ORDER BY在JOIN SELECT中不起作用

时间:2015-12-21 16:12:30

标签: mysql

我有2个表:ticketticket_message

我想选择我们的支持团队无法解答的所有门票。这意味着在故障单中留下的最后一条消息将具有类型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 5.5.42的开发服务器上完美运行,但是消息不能在MySQL 5.7.9的生产服务器上的子查询中排序

以下是EXPLAIN结果:

表示5.5.42:

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

for 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

1 个答案:

答案 0 :(得分: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放入群组中,否则您可能会收到意外结果。

关于使用&#34; Group By&#34;

的注意事项

使用Group By很容易被捕获,并且应该遵循规则

您选择的字段应显示在&#34; Group By&#34;条款。如果它们不在group by子句中,则应该应用聚合函数。

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