我有一个奇怪的问题。当我执行查询时,数据不会显示在Resultset
中,但是当我点击ResultSet
中的列标题对其进行排序时,会显示该行。
我的表看起来像这样 -
id user_id action_id object_id MAX(s.timestamp)
2825 61 2 806 16/06/2012 03:41:55
2818 208 4 0 15/06/2012 15:11:30 -- problematic row
2817 21 7 1 15/06/2012 13:18:38
2816 208 4 0 15/06/2012 12:11:30 -- problematic row
2803 320 9 806 14/06/2012 23:14:32
2802 320 9 805 14/06/2012 17:15:54
2801 208 4 0 14/06/2012 15:11:30 -- problematic row
我使用以下查询 -
SELECT MAX(activity_stream_id) id,
s.user_id,
s.action_id,
s.object_id,
MAX(s.timestamp)
FROM pp_activitystream s
GROUP BY s.user_id, s.action_id, s.object_id
ORDER BY s.timestamp DESC
理想情况下,在ResultSet
我应该得到“有问题的行”的最顶层,但我没有。
当我单击列标题对行进行排序时,会出现“有问题的行”。
你能告诉我为什么它会这样吗?
我使用Toad
和MySQL Workbench
执行了上述查询,其行为方式相同。
执行后的输出 -
id user_id action_id object_id MAX(s.timestamp)
2825 61 2 806 16/06/2012 03:41:55
2817 21 7 1 15/06/2012 13:18:38
2803 320 9 806 14/06/2012 23:14:32
2802 320 9 805 14/06/2012 17:15:54
单击要排序的任何列标题后的输出(在这种情况下为时间戳) -
id user_id action_id object_id MAX(s.timestamp)
2825 61 2 806 16/06/2012 03:41:55
2818 208 4 0 15/06/2012 15:11:30 -- row appears
2817 21 7 1 15/06/2012 13:18:38
2803 320 9 806 14/06/2012 23:14:32
2802 320 9 805 14/06/2012 17:15:54
答案 0 :(得分:2)
SELECT MAX(activity_stream_id) id,
s.user_id,
s.action_id,
s.object_id,
MAX(s.timestamp) as ts
FROM pp_activitystream s
GROUP BY s.user_id, s.action_id, s.object_id
ORDER BY ts DESC
Mysql允许您在group
ed列中使用非select
ed列,在select
子句中使用非order by
ed列。即使有时可能感觉性感或有用(至少对我而言),它在概念上存在缺陷,并且可能导致很难发现错误。
在这种情况下,您尝试对在select中显示为聚合列的列进行排序,从而导致不可预测的结果。当你点击toad或mysql-workbench中的结果集表头时,你实际上告诉mysql在MAX(timestamp)
上订购,让事情正常。