奇怪的MySQL行为。排序后会显示某些行,但执行后不会显示

时间:2012-06-16 12:15:37

标签: mysql sql mysql-workbench toad

我有一个奇怪的问题。当我执行查询时,数据不会显示在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我应该得到“有问题的行”的最顶层,但我没有。 当我单击列标题对行进行排序时,会出现“有问题的行”。

你能告诉我为什么它会这样吗?

我使用ToadMySQL 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

1 个答案:

答案 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)上订购,让事情正常。