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。*但这不在组中

+0

对OP的注意:select语句中的聚合函数就像'count()','sum()'等等......你正在评估分组的所有值。 – Ray

+0

正确concat不是聚合函数是线性的.. group_concat是一个聚合函数 – scaisEdge

+0

DuH !!好,赶上,编辑我的评论 – Ray