MySQL,了解SQL查询行为

时间:2013-12-18 02:07:50

标签: mysql sql

我有一个简单的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。 我做错了什么?

2 个答案:

答案 0 :(得分:2)

您需要加入:

SELECT a.id, a.date
FROM foo a
INNER JOIN (SELECT MAX(id) as max_id FROM foo GROUP BY sid) b ON a.id = b.max_id

答案 1 :(得分:2)

标准SQL的定义方式(至少到1992年的ansi,其他人会纠正我),SELECT子句的任何字段都必须按条件包含在您的组中。 [Mysql允许你不这样做,但这就是令人困惑的原因:结果并不像你期望的那样]

您的查询应该是:

SELECT MAX(id), date FROM my_table GROUP BY sid, date 

但在这种情况下,显然这不是你想要的。您的要求是为每个MAX(id)获取与sId相对应的日期。

您必须在不同的查询中隔离算法的每个部分。

1 - 获取每个sid的最大ID:

SELECT MAX(id) AS id, sid FROM my_table GROUP BY sid

2 - 获取与每个sid的最大ID相对应的日期:

SELECT date FROM my_table WHERE sid = X AND id = Y

3 - 很快使用INNER JOIN或更多JOIN加入这2个查询:{/ 1}:

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