我有一个简单的 MySQL 表:
| id | sid | date |
+--------+---------+------------+
| 1 | 1 | 2013-12-01 |
+--------+---------+------------+
| 3 | 2 | 2013-12-17 |
+--------+---------+------------+
| 4 | 1 | 2013-12-17 |
+--------+---------+------------+
| 5 | 1 | 2013-12-18 |
+--------+---------+------------+
我需要按 sid 字段对这个表进行分组,并为每个 sid 获取具有正确日期的最大 id 的记录。我尝试以下代码:
SELECT MAX(id), date FROM my_table GROUP BY sid
但是日期字段不正确,例如我得到的日期是 2013-12-01,id 是 5。 我做错了什么?
最佳答案
标准 SQL 的定义方式(至少到 ansi 1992,其他人会纠正我),您的 SELECT 子句的任何字段都必须按条件包含在您的组中。 [Mysql允许你不这样做,但这就是它令人困惑的原因:结果不是你期望的那样]
您的查询应该是:
SELECT MAX(id), date FROM my_table GROUP BY sid, date
但在这种情况下,显然这不是您想要的。您的要求是为每个 sId
获取与 MAX(id)
对应的日期。
您必须在不同的查询中隔离算法的每个部分。
1 - 获取每个 sid 的最大 id:
SELECT MAX(id) AS id, sid FROM my_table GROUP BY sid
2 - 获取与每个 sid
的最大 ids 对应的日期:
从 my_table 中选择日期,其中 sid = X AND id = Y
3 - 使用 INNER JOIN
或更简短的 JOIN
加入这 2 个查询:
SELECT m.sid, m.id, m.date
FROM my_table m
JOIN (SELECT MAX(id) AS id, sid FROM my_table GROUP BY sid) t
ON t.sid = m.sid AND m.id = t.id
关于MySQL,了解 SQL 查询行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20648446/