MySQL中的any_value()函数

硅谷探秘者 数据库 3654 0 0

有如下数据:

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()会选择被分到同一组的数据里第一条数据的指定列值作为返回数据。

猜你喜欢
数据库基础 2463 sql常用