MysqlSQL根据多列分组取最早的一条数

mbz_02120422 2016-12-29 03:35:37
有表a:

CREATE TABLE `a` (
`id` int(10) NOT NULL,
`name` varchar(255) DEFAULT NULL,
`addtime` int(16) DEFAULT NULL
)

id name addtime
1 aa 1482823400
10 bb 1482823600
4 bb 1482823200
3 cc 1482823700
5 cc 1482823300
6 ff 1482823800
为什么以下语句能查出结果,居然不会报错?
select 后的查询列(不包含聚合函数列)难道不是必须要出现在group by 后吗?
select * 就包含了id列,为什么group by后无id 列能出结果?

select * from
(select * from a ORDER BY addtime) aa
GROUP BY NAME

查询结果如下:
1 aa 1482823400
4 bb 1482823200
5 cc 1482823300
6 ff 1482823800
...全文
368 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
mbz_02120422 2016-12-29
  • 打赏
  • 举报
回复
引用 4 楼 中国风的回复:
不报错 mysql 具有隐含字段的GROUP BY MySQL 扩展了 GROUP BY的用途,因此你可以使用SELECT 列表中不出现在GROUP BY语句中的列或运算。这代表 “对该组的任何可能值 ”。你可以通过避免排序和对不必要项分组的办法得到它更好的性能。 假如你从 GROUP BY 部分省略的列在该组中不是唯一的,那么不要使用这个功能! 你会得到非预测性结果。
虽然理解的懵懵懂懂,但一个说的通的解释可以说服我去理解,而不再惊讶!长见识了,谢~
中国风 2016-12-29
  • 打赏
  • 举报
回复
不报错 mysql 具有隐含字段的GROUP BY MySQL 扩展了 GROUP BY的用途,因此你可以使用SELECT 列表中不出现在GROUP BY语句中的列或运算。这代表 “对该组的任何可能值 ”。你可以通过避免排序和对不必要项分组的办法得到它更好的性能。 假如你从 GROUP BY 部分省略的列在该组中不是唯一的,那么不要使用这个功能! 你会得到非预测性结果。
卖水果的net 版主 2016-12-29
  • 打赏
  • 举报
回复
引用 2 楼 sinat_21382819 的回复:
为什么没报错?好奇,算是符合语法规则吗?是不是select 后只有明确谢了列名才要出现在group by 后,select * 中的“*”巧妙的避开了这个规则
mysql 支持某些非标准语法,不建议使用他们;
mbz_02120422 2016-12-29
  • 打赏
  • 举报
回复
引用 1 楼 wmxcn2000 的回复:

-- 不建议使用非标准语法,尽 管  mysql 支持

mysql> CREATE TABLE `a` (
    ->  `id` int(10) NOT NULL,
    ->  `name` varchar(255) DEFAULT NULL,
    ->  `addtime` int(16) DEFAULT NULL
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> insert into a values(1 , 'aa', 1482823400);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(10, 'bb', 1482823600);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(4 , 'bb', 1482823200);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(3 , 'cc', 1482823700);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(5 , 'cc', 1482823300);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(6 , 'ff', 1482823800);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from a
    -> where not exists(
    ->  select * from a x where a.name = x.name and a.addtime > x.addtime);
+----+------+------------+
| id | name | addtime    |
+----+------+------------+
|  1 | aa   | 1482823400 |
|  4 | bb   | 1482823200 |
|  5 | cc   | 1482823300 |
|  6 | ff   | 1482823800 |
+----+------+------------+
4 rows in set (0.02 sec)

mysql>
mysql> drop table a;
Query OK, 0 rows affected (0.00 sec)
为什么没报错?好奇,算是符合语法规则吗?是不是select 后只有明确谢了列名才要出现在group by 后,select * 中的“*”巧妙的避开了这个规则
卖水果的net 版主 2016-12-29
  • 打赏
  • 举报
回复

-- 不建议使用非标准语法,尽 管  mysql 支持

mysql> CREATE TABLE `a` (
    ->  `id` int(10) NOT NULL,
    ->  `name` varchar(255) DEFAULT NULL,
    ->  `addtime` int(16) DEFAULT NULL
    -> );
Query OK, 0 rows affected (0.02 sec)

mysql>
mysql> insert into a values(1 , 'aa', 1482823400);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(10, 'bb', 1482823600);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(4 , 'bb', 1482823200);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(3 , 'cc', 1482823700);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(5 , 'cc', 1482823300);
Query OK, 1 row affected (0.00 sec)

mysql> insert into a values(6 , 'ff', 1482823800);
Query OK, 1 row affected (0.00 sec)

mysql>
mysql> select * from a
    -> where not exists(
    ->  select * from a x where a.name = x.name and a.addtime > x.addtime);
+----+------+------------+
| id | name | addtime    |
+----+------+------------+
|  1 | aa   | 1482823400 |
|  4 | bb   | 1482823200 |
|  5 | cc   | 1482823300 |
|  6 | ff   | 1482823800 |
+----+------+------------+
4 rows in set (0.02 sec)

mysql>
mysql> drop table a;
Query OK, 0 rows affected (0.00 sec)

34,575

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧