Loading... # 引言 近期一个个人项目上使用了MySQL,但是在kali上运行时报错,经过溯源找到了具体语句异常,mariadb不支持这个函数,因此写了这片博客,供MYSQL切换mariadb的用户参考。 # 举个例子 定义一张表`a`,他的结构是`id`和`name`,其中id是唯一的,name可重复。分别在mariadb和mysql上。 ```sql mysql> select * from a; +------+--------+ | id | name | +------+--------+ | 1 | zunmx | | 2 | matrix | | 3 | zunmx | | 4 | matrix | +------+--------+ ``` ```sql MariaDB [test]> select * from a; +------+--------+ | id | name | +------+--------+ | 1 | zunmx | | 2 | matrix | | 3 | zunmx | | 4 | matrix | +------+--------+ ``` 此时,如果我需要进行分组name,并且随意返回一个id 在MySQL中,可以使用 ```sql mysql> select any_value(id), name from a group by name; +---------------+--------+ | any_value(id) | name | +---------------+--------+ | 1 | zunmx | | 2 | matrix | +---------------+--------+ 2 rows in set (0.00 sec) ``` 同理,在mariadb中,就会报错。 ```sql MariaDB [test]> select any_value(id), name from a group by name; ERROR 1305 (42000): FUNCTION test.any_value does not exist ``` # 解决方案 1. 去掉sql_mode中的ONLY_FULL_GROUP_BY,并且去掉any_value > ```sql > SET SESSION sql_mode = REPLACE(@@SESSION.sql_mode, 'ONLY_FULL_GROUP_BY', ''); > ``` 2. 使用聚合函数,如min,max,avg,sum等 # 结语 实际上any_value是一种避免报错的手段,不关心这个字段的值是什么。这个函数放宽了SQL的聚合约束,实际上更规范的是使用聚合。 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏