【问题标题】:MySql 5.7.18 error in Group by clause with sql_mode=only_full_group_by使用 sql_mode=only_full_group_by 的 Group by 子句中的 MySql 5.7.18 错误
【发布时间】:2017-06-29 11:59:36
【问题描述】:

我在 Ubuntu Server 16.xx 上使用 MySql 版本 5.7.18,

我有以下疑问:

 SELECT DISTINCT 
    w.sno,
    CONCAT(
      CONCAT(
       (SELECT 
          bch_lbl 
        FROM
          list_benches 
        WHERE sno = w.lb_sno),
          ' => ',
          CASE
            WHEN w.bench_cat_sno = 0 
            THEN 'All Categories' 
          ELSE 
            (SELECT 
               cat_name 
            FROM
               case_categories 
            WHERE sno = w.bench_cat_sno) 
         END,
          ' [From ',
            b.date_from,
          ' To ',
          b.date_to,
           '] '
         ),
     CASE
        WHEN b.is_active = 1 
     THEN 'Active' 
     ELSE 'Expired' 
    END
      ) AS benchLbl,
        w.is_active,
        b.j_sno 
  FROM
      working_benches w,
      bench_judges b 
  WHERE w.sno = b.b_sno 
  GROUP BY w.sno 
  ORDER BY b.is_active DESC ;

执行后,此查询返回以下错误:

Error Code: 1055
Expression #2 of SELECT list is not in GROUP BY clause and contains 
nonaggregated column 'phc_caseflow.b.date_from' which is not functionally 
dependent on columns in GROUP BY clause; this is incompatible with 
sql_mode=only_full_group_by

我唯一了解的是“sql_mode=only_full_group_by”,它成为上述错误的原因。

任何人都可以建议我如何更改上述查询以适应并解决问题 - 只需要编辑我的查询而不是 sql_mode:

提前谢谢...

【问题讨论】:

    标签: mysql procedure


    【解决方案1】:

    在查看所有日志文件并搜索问题后,我发现这是 MySql 版本次要版本中的“BIG”更新,即 v 5.7.18。因此,我找到的解决方案是执行以下快捷方式:

    sudo nano /etc/mysql/my.cnf
    Add this to the end of the file
    
    [mysqld]  
    sql_mode = "STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"
    

    我的查询在服务器上运行得非常好,我的意思是在我的生产服务器上......

    【讨论】:

      【解决方案2】:

      一开始我发现您的查询存在的问题是您在 SQL 语句中而不是在您的应用程序中格式化结果。

      添加诸如“=>”和“From [”、“Active”、“Expired”之类的东西会放弃这一点。这种类型的格式化应该在您的应用程序中完成,而不是在您的 SQL 中。

      我的建议是重新编写查询,删除 CONCAT(肯定)和 CASE(如果可能)的使用,并使查询仅返回您所追求的原始数据。

      一旦查询工作并返回原始数据,请在应用程序代码中根据需要对其进行格式化。如果这是不可能的,我怀疑你会在很长一段时间内与这个查询作斗争。

      【讨论】:

      • 我已经在我的开发人员机器上运行了相同的查询,其中“sql_mode”不是“唯一的完整分组依据”,它工作正常,此外,我在查询中保留了 case 和 concat只是因为我已经把它放在程序中并一次又一次地调用......从多个表中填充下拉列表。
      • 我在这里。事情是,它看起来像是“在我的机器上工作”的经典案例。虽然这是真的,但它并没有在生产中发挥作用,这才是重要的。看来您的选择可能有限。
      猜你喜欢
      • 2018-04-13
      • 1970-01-01
      • 2018-03-23
      • 2020-06-14
      • 2017-04-30
      • 2016-10-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多