SQL中MAX函数与Group By一起使用,获取同一字段重复的数据只取记录最大的一条,如下:
1 2 3 4 5 6 7 8 9 10 11 12 |
mysql> select * from test; +----+-------+------+-------+ | id | name | age | clz | +----+-------+------+-------+ | 1 | qiu | 22 | 1 | | 2 | liu | 42 | 1 | | 4 | zheng | 20 | 2 | | 3 | qian | 20 | 2 | | 0 | wang | 11 | 3 | | 6 | li | 33 | 3 | +----+-------+------+-------+ 6 rows in set (0.00 sec) |
如果想找到每个clz里面的最大的age,则需要使用Group By和Max。
如下的SQL语句,则输出结果有错误:
1 2 3 4 5 6 7 8 9 |
mysql> select id,name,max(age),clz from test group by clz; +----+-------+----------+-------+ | id | name | max(age) | clz | +----+-------+----------+-------+ | 1 | qiu | 42 | 1 | | 4 | zheng | 20 | 2 | | 0 | wang | 33 | 3 | +----+-------+----------+-------+ 3 rows in set (0.00 sec) |
虽然找到的age是最大的age,但是与之匹配的用户信息却不是真实的信息,而是Group By分组后的第一条记录的基本信息。
如果我使用以下的语句进行查找,则可以返回真实的结果。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> select * from ( -> select * from test order by age desc) as b -> group by clz; +----+-------+------+-------+ | id | name | age | clz | +----+-------+------+-------+ | 2 | liu | 42 | 1 | | 4 | zheng | 20 | 2 | | 6 | li | 33 | 3 | +----+-------+------+-------+ 3 rows in set (0.00 sec) |