SQLSTATE [42000]:语法错误或访问冲突:1055表达式#2

时间:2016-11-17 18:56:40

标签: mysql

我试图了解MySql 5.7的工作原理。在下面的查询中

      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',它在功能上不依赖于GROUP BY子句中的列;这与sql_mode = only_full_group_by [code: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 ;

由于我正在使用localhost,我可以更改my.ini文件并将sql_mode设置为“STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER”

但是当它上线时,这将是一个问题,因为很多人不会访问my.ini文件,特别是在共享主机上。

在我看来,声明每个字段并相应地聚合是非常有效的。

由于我在MySql中的知识只是初学者,有没有更好的方法来编写上面的查询。在我需要从单个表中提取10或20个字段的情况下,聚合所有字段似乎有点傻。

1 个答案:

答案 0 :(得分:1)

概念很简单,您必须在所有未参与聚合函数的列中声明

你的

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。*但这不是分组