MySQL ANY_VALUE() 函数使用指南

MySQL ANY_VALUE() 函数返回指定列中的任意一个值,它用在包含了 GROUP BY 的语句中,以抑制 ONLY_FULL_GROUP_BY 导致的错误。

ANY_VALUE() 语法

这里是 MySQL ANY_VALUE() 函数的语法:

ANY_VALUE(column_name)

参数

column_name
必需的。 一个列名。

返回值

MySQL ANY_VALUE() 函数返回指定列中的任意一个值。

ANY_VALUE() 示例

为了演示 ANY_VALUE() 函数的用法,让我们使用如下语句创建一个表 test_any_value,它包含了 id, user, 和 address 三个列:

CREATE TABLE test_any_value (
    id INT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(255) NOT NULL,
    address VARCHAR(255) NOT NULL
);

然后,让我们再插入几条数据:

INSERT INTO test_any_value (name, address)
VALUES
    ('Tom', 'Address 1 of Tom'),
    ('Tom', 'Address 2 of Tom'),
    ('Adam', 'Address of Adam');

让我们看一下表中的数据:

SELECT * FROM test_any_value;
+----+------+------------------+
| id | name | address          |
+----+------+------------------+
|  1 | Tom  | Address 1 of Tom |
|  2 | Tom  | Address 2 of Tom |
|  3 | Adam | Address of Adam  |
+----+------+------------------+

现在,我们想要统计每个人的地址的数量,并显示每个人的任意一个地址:

SELECT name,
    COUNT(address) AS count,
    address
FROM test_any_value
GROUP BY name;

当我们运行这个语句的时候,MySQL 返回了一个错误:”ERROR 1055 (42000): Expression #3 of SELECT list is not in GROUP BY clause and contains nonaggregated column ’testdb.test_any_value.address’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by“。

这里,让我们使用 ANY_VALUE() 解决这个问题:

SELECT name,
    COUNT(address) AS count,
    ANY_VALUE(address) AS address
FROM test_any_value
GROUP BY name;
+------+-------+------------------+
| name | count | address          |
+------+-------+------------------+
| Tom  |     2 | Address 1 of Tom |
| Adam |     1 | Address of Adam  |
+------+-------+------------------+

现在,MySQL 没有给出错误并返回了我们期望的结果。 这与在不使用 ANY_VALUE() 并将 ONLY_FULL_GROUP_BY 模式禁用掉的结果完全一样。