引言
近期一个个人项目上使用了MySQL,但是在kali上运行时报错,经过溯源找到了具体语句异常,mariadb不支持这个函数,因此写了这片博客,供MYSQL切换mariadb的用户参考。
举个例子
定义一张表a,他的结构是id和name,其中id是唯一的,name可重复。分别在mariadb和mysql上。
mysql> select * from a;
+------+--------+
| id | name |
+------+--------+
| 1 | zunmx |
| 2 | matrix |
| 3 | zunmx |
| 4 | matrix |
+------+--------+
MariaDB [test]> select * from a;
+------+--------+
| id | name |
+------+--------+
| 1 | zunmx |
| 2 | matrix |
| 3 | zunmx |
| 4 | matrix |
+------+--------+
此时,如果我需要进行分组name,并且随意返回一个id
在MySQL中,可以使用
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中,就会报错。
MariaDB [test]> select any_value(id), name from a group by name;
ERROR 1305 (42000): FUNCTION test.any_value does not exist
解决方案
-
去掉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的聚合约束,实际上更规范的是使用聚合。


评论 0
还没有评论,来说点什么吧。