我有一个奇怪的问题。当我执行查询时,数据未显示在 Resultset
中,但是当我单击 ResultSet
中的列标题对其进行排序时,该行出现。
我的 table 看起来像这样 -
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
最佳答案
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 允许您在 select
ed 列中使用非group
ed 列,以及在 order by 中使用非
子句。即使这有时会让人觉得性感或有用(至少对我而言),但它在概念上是有缺陷的,并且可能导致很难发现的错误。select
ed 列
在这种情况下,您试图对在选择中显示为聚合列的列进行排序,从而导致不可预测的结果。当您在 toad 或 mysql-workbench 中单击结果集表头时,您实际上是在告诉 mysql 按 MAX(timestamp)
进行排序,从而使一切正常进行。
关于mysql - 奇怪的 MySQL 行为。有些行在排序后出现但在执行后不出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11063328/