MySQL 中使用 MAX() 进行分组和聚合
在 MySQL 中,MAX() 函数可以与 GROUP BY 结合使用子句来聚合数据并选择每个组中指定列的最大值。但是,如果目标列在组中不唯一,则选择相应的非聚合列可能会产生意外结果。
为了说明此问题,让我们检查以下 SQL 查询:
SELECT MAX(timestamp), rid, pid FROM theTable GROUP BY rid;
此查询的结果可能与期望的结果不一致,因为所选的 pid 列可能与最大值的时间戳不匹配。
要获取正确的结果结果,我们需要修改查询以识别每个组中具有最大时间戳的行,然后将这些行与原始表连接以获得相应的 pid。
以下修改后的 SQL 查询可以完成此操作:
SELECT test.pid, test.cost, test.timestamp, test.rid FROM theTable AS test INNER JOIN (SELECT rid, MAX(timestamp) AS ts FROM theTable GROUP BY rid) AS maxt ON (test.rid = maxt.rid AND test.timestamp = maxt.ts);
此查询首先使用子查询识别每个 Rid 的最大时间戳,然后将其与原始表连接。连接条件确保所选行是每个 Rid 组内具有最大时间戳的行。
因此,获得所需的输出:
pid | cost | timestamp | rid |
---|---|---|---|
5 | 345 | 2011-04-14 01:06:06 | 1 |
3 | 4455 | 2011-04-14 01:05:41 | 2 |
7 | 5435 | 2011-04-14 01:14:14 | 3 |
以上是如何使用MySQL的MAX()和GROUP BY正确检索非聚合列?的详细内容。更多信息请关注PHP中文网其他相关文章!