MySQL,了解 SQL 查询行为

标签 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。 我做错了什么?

最佳答案

标准 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/

相关文章:

sql - 使用 SQL 插入或更新优化性能的策略

MySQL SELECT JOIN ON 3 个表 "continue"查询,如果 1 个连接不返回任何内容

python - Flask-sqlalchemy 失去了与 MySQL 数据库的连接

MySQL使用多列选择重复记录

php - 通过Yii中的多对多关系查找不相关的记录

mysql - MySQL 中会自动索引唯一键 - 这是真的吗?

MySQL - 如何订购连接表?

php - MySQL - 计算数据库中名称实例的不同数量

python - 为什么我的数据库抛出错误?

PHP MySql - 每个页面加载的最大查询数