有如下数据:
mysql> select * from area;
+----+----------------+----------------+-----------+-----------+
| id | proviance_code | proviance_name | city_code | city_name |
+----+----------------+----------------+-----------+-----------+
| 1 | 1 | 河南 | 1 | 商丘 |
| 2 | 1 | 河南 | 2 | 南阳 |
| 3 | 1 | 河南 | 3 | 开封 |
| 7 | 2 | 杭州 | 1 | 余杭区 |
| 8 | 2 | 杭州 | 2 | 拱墅区 |
| 9 | 2 | 杭州 | 3 | 下城区 |
+----+----------------+----------------+-----------+-----------+
6 rows in set (0.00 sec)
要求查询所有的省份
方案1
SELECT DISTINCT(proviance_code),proviance_name from area;
方案2
SELECT proviance_code,any_value(proviance_name) from area GROUP BY proviance_code;
mysql5.7以及之前还可以用以下sql:
SELECT proviance_code,proviance_name from area GROUP BY proviance_code;
但是mysql5.7之后会报错:
SELECT proviance_code,proviance_name from area GROUP BY proviance_code
> 1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'area.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
> 时间: 0.016s
原因:MySQL5.7之后,sql_mode中ONLY_FULL_GROUP_BY模式默认设置为打开状态。ONLY_FULL_GROUP_BY的语义就是确定select target list中的所有列的值都是明确语义,简单的说来,在此模式下,target list中的值要么是来自于聚合函数(sum、avg、max等)的结果,要么是来自于group by list中的表达式的值。
any_value:MySQL提供了any_value()函数来抑制ONLY_FULL_GROUP_BY值被拒绝,any_value()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据。