我有2个表:ticket
和ticket_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
答案 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_message
。timeCreated
放入群组中,否则您可能会收到意外结果。
关于使用&#34; Group By&#34;
的注意事项使用Group By很容易被捕获,并且应该遵循规则
您选择的字段应显示在&#34; Group By&#34;条款。如果它们不在group by子句中,则应该应用聚合函数。
https://mariadb.com/kb/en/sql-99/rules-for-grouping-columns/