SQLSTATE [42000]:语法错误或访问冲突:1055表达式#2
问题描述:
我试图了解MySql 5.7如何工作。在查询波纹管SQLSTATE [42000]:语法错误或访问冲突:1055表达式#2
SELECT
r.*,
CONCAT(u.fname, ' ', u.lname) AS name
FROM
`events` AS r
LEFT JOIN `users` AS u
ON r.user_id = u.id
WHERE r.event_id = 1
GROUP BY r.user_id
ORDER BY r.date ;
我得到一个错误“SELECT列表是不是在GROUP BY子句中包含非聚合列‘r.id’,这并不功能依赖于BY子句中的列组,这是不兼容的sql_mode = only_full_group_by [代码:42000] “
但是这样的查询工作正常:
SELECT
r.id,
r.event_id,
r.user_id,
r.date
CONCAT(u.fname, ' ', u.lname) AS name
FROM
`events` AS r
LEFT JOIN `users` AS u
ON r.user_id = u.id
WHERE r.event_id = 1
GROUP BY r.user_id, r.event_id, r.id, r.date
ORDER BY r.date ;
由于我工作在本地主机上,我可以更改my.ini文件和设置的sql_mode为” STRICT_ALL_TABLES ,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER“
但是当上线时这将会成为一个问题,因为不会有很多人能够访问my.ini文件,尤其是共享主机。
在我看来,位无效宣布每个字段和相应的聚合。
由于我在MySql中的知识只是初学者,有没有更好的方法来编写上述查询。在我需要从单个表中抽取10或20个字段的情况下,将所有这些字段合并在一起看起来有点愚蠢。
答
的概念很简单,你必须在组未参与聚合功能的所有列声明
您
SELECT
r.id,
r.event_id,
r.user_id,
r.date
CONCAT(u.fname, ' ', u.lname) AS name
FROM
`events` AS r
LEFT JOIN `users` AS u
ON r.user_id = u.id
WHERE r.event_id = 1
GROUP BY r.user_id, r.event_id, r.id, r.date
ORDER BY r.date ;
相当于
SELECT DISTINCT
r.id,
r.event_id,
r.user_id,
r.date
CONCAT(u.fname, ' ', u.lname) AS name
FROM
`events` AS r
LEFT JOIN `users` AS u
ON r.user_id = u.id
WHERE r.event_id = 1
ORDER BY r.date ;
在第一你有r。*但这不在组中
对OP的注意:select语句中的聚合函数就像'count()','sum()'等等......你正在评估分组的所有值。 – Ray
正确concat不是聚合函数是线性的.. group_concat是一个聚合函数 – scaisEdge
DuH !!好,赶上,编辑我的评论 – Ray