【问题标题】:SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #2SQLSTATE [42000]:语法错误或访问冲突:1055 表达式 #2
【发布时间】:2017-04-01 11:13:13
【问题描述】:

我试图了解 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 子句中,并且包含在功能上不依赖于 GROUP BY 子句中的列的非聚合列 'r.id';这与 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 ;

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

但是当上线时,这将是一个问题,因为没有多少人可以访问 my.ini 文件,尤其是在共享主机上。

在我看来,声明每个字段并相应地进行聚合有点效率不高。

由于我对 MySql 的了解只是初学者,有没有更好的方法来编写上述查询。在我需要从一个表中提取 10 或 20 个字段的情况下,聚合所有字段似乎有点愚蠢。

【问题讨论】:

    标签: mysql


    【解决方案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.* 但这不在 group by 中

    【讨论】:

    • OP 说明:select 子句中的聚合函数类似于count()sum() 等...您正在评估分组的所有值。
    • 正确的 concat 不是聚合函数是线性的.. group_concat 是聚合函数
    • 我没有编辑你的评论。我说过你的评论是正确的..
    猜你喜欢
    • 2018-05-31
    • 2017-02-01
    • 2017-07-31
    • 2019-06-06
    • 2020-06-16
    • 2015-10-12
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多