mysql - 奇怪的 MySQL 行为。有些行在排序后出现但在执行后不出现

标签 mysql sql mysql-workbench toad

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

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

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

最佳答案

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

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

关于mysql - 奇怪的 MySQL 行为。有些行在排序后出现但在执行后不出现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11063328/

相关文章:

javascript - 如何增加 dhtmlxgantt 图表的日期

sql - mysql "datetime NOT NULL DEFAULT ' 1970-01-0 1' "变成 0000-00-00 00 :00:00

sql - 为什么对我的聚集索引进行扫描?

mysql - 查询执行时间过长

mysql - 重复的 Inter_Columns

php - 选中时从表中插入多个数组项

mysql - SQL连接三张表(一张是关系表)

mysql - 使用选择在其他表中查找值

sql - 类似于记事本教程 :CursorIndexOutOfBoundsException: Index 0 requested, 的应用程序上的 Android SQL 问题,大小为 0

python - 如何从本地计算机连接到部署在计算引擎上的mysql-server?