1

我有一个奇怪的问题。当我执行查询时,数据不会显示在 中,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我使用and执行了上述查询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
4

1 回答 1

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 允许您在 ed 列中使用非edgroup列,在子句中使用非 ed 列。即使这有时可能会让人觉得性感或有用(至少对我而言),但它在概念上存在缺陷,并且可能导致难以发现的错误。selectselectorder by

在这种情况下,您尝试对在 select 中显示为聚合列的列进行排序,从而导致不可预测的结果。当您单击 toad 或 mysql-workbench 中的结果集表头时,您实际上是在告诉 mysql 进行排序MAX(timestamp),从而使一切正常。

于 2012-06-16T12:38:17.557 回答