两个相似的 MySQL 查询给出不同的结果

Posted

技术标签:

【中文标题】两个相似的 MySQL 查询给出不同的结果【英文标题】:Two similar MySQL queries give different results 【发布时间】:2012-06-29 13:56:26 【问题描述】:

我有一个保存设备读数的数据库。我正在尝试编写一个可以从设备中选择最新读数的查询。我有两个看似相同的查询,我希望给出相同的结果;但是他们没有。查询如下:

第一个查询:

select max(datetime), reading
from READINGS
where device_id = '1234567890'

第二次查询:

select datetime, reading
from READINGS
where device_id = '1234567890' and datetime = (select max(datetime)
                                               from READINGS
                                               where device_id = '1234567890')

它们都为阅读属性提供不同的结果。第二个是给出正确结果的那个,但为什么第一个给出不同的结果?

【问题讨论】:

【参考方案1】:

这是 mysql 的行为。当您使用分组时,您选择的列必须要么出现在分组依据中,要么是一个聚合函数,例如 min()、max()。在大多数其他数据库风格中,不允许混合聚合和普通列。

第一个查询将只返回每个组中的第一个评级(首先是它出现在文件系统上的位置),这很可能是错误的。

第二个查询将评级与导致正确结果的最大时间戳相关联。

【讨论】:

所以如果我在 MSSQL 之类的东西中尝试第一个,它可能会向我吐口水并告诉我我错了? @Perley 第一次查询?很有可能,我相信只有 SQLite 在这方面的行为与 MySQL 相同。【参考方案2】:

这是因为您没有使用 GROUP BY reading 子句,您应该在两个查询中都使用它。

【讨论】:

那根本行不通。它给了我完全不同的东西。当阅读甚至不是我要汇总的内容时,我为什么要使用 group by?【参考方案3】:

这在 MySQL 上是正常的。请参阅documentation:

If you use a group function in a statement containing no GROUP BY clause, it is equivalent to grouping on all rows. 

另外,请阅读http://dev.mysql.com/doc/refman/5.0/en/group-by-hidden-columns.html

【讨论】:

【参考方案4】:

您可以使用Explain 和Explan extended 命令来了解有关您的查询的更多信息。

【讨论】:

以上是关于两个相似的 MySQL 查询给出不同的结果的主要内容,如果未能解决你的问题,请参考以下文章

Informix SQL 查询:返回不同结果的两个相似查询

为啥这个 MySQL 存储函数给出的结果与在查询中进行计算不同?

两个相似查询的巨大速度差异(MySQL ORDER 子句)

为啥 Snowflake 中这两个相似的查询具有非常不同的性能?

MySQL两个查询合并成一个结果

MySQL两个查询合并成一个结果