【问题标题】:Incompatibility with Mysql 5.7(Expression #1 of ORDER BY clause is not in SELECT list)与 Mysql 5.7 不兼容(ORDER BY 子句的表达式 #1 不在 SELECT 列表中)
【发布时间】:2017-05-18 20:00:01
【问题描述】:

当我执行以下查询时,我收到一个异常:

错误代码:3065 ORDER BY 子句的表达式 #1 不在 SELECT 中 列表,引用不在的列“webstore.level_depth” 选择列表;这与 DISTINCT 不兼容

我的查询:

SELECT DISTINCT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite
FROM `pj_category_shop` cs, `pj_category` c
INNER JOIN `pj_category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = 1 AND cl.id_shop = 2 )
WHERE (c.`active` = 1 OR c.`id_category` = 2)
  AND cs.`id_category` = c.`id_category`
  AND cs.`id_shop` = 2
  AND c.`id_category` != 1
  AND `level_depth` <= 2
  AND c.id_category IN (
    SELECT id_category
    FROM `pj_category_group`
    WHERE `id_group` IN (3)
  )
ORDER BY `level_depth` ASC, cl.`name` ASC;

为什么会这样?

【问题讨论】:

    标签: mysql


    【解决方案1】:

    ORDER BY 列应为SELECT 列表中列出的列

    在您的选择列表中添加c.level_depth

    试试:

    SELECT DISTINCT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite, c.level_depth
        FROM `pj_category_shop` cs, `pj_category` c
        INNER JOIN `pj_category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = 1 AND cl.id_shop = 2 )
        WHERE (c.`active` = 1 OR c.`id_category` = 2)
        AND cs.`id_category` = c.`id_category` AND cs.`id_shop` = 2
        AND c.`id_category` != 1
         AND `level_depth` <= 2
        AND c.id_category IN (SELECT id_category FROM `pj_category_group` WHERE `id_group` IN (3))
        ORDER BY c.`level_depth` ASC, cl.`name` ASC;
    

    【讨论】:

    • 感谢 pradeep 的快速回复。但我有一个条件,我不会在查询中进行更改。
    【解决方案2】:

    我已经找到了我的问题的答案。实际上 mysql 5.7 在 sql 模式下包含 'ONLY_FULL_GROUP_BY'。所以我们不能在不是的元素中执行 orderby在选择列表中。我们必须将其更改为

    'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' 
    

    进入

    'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    

    我们可以通过执行以下查询来做到这一点

    SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    
    SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
    

    【讨论】:

    • 其实你应该只需要执行其中一个。 GLOBAL 变量影响服务器的整体操作,而 SESSION 变量影响单个客户端连接的操作。 (dev.mysql.com/doc/refman/5.7/en/using-system-variables.html)。
    • 要使用 MySQL 5.6 中的值,删除除最后一个选项之外的所有选项:set global SQL_MODE="NO_ENGINE_SUBSTITUTION";
    【解决方案3】:
    SELECT DISTINCT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite
                FROM `pj_category_shop` cs, `pj_category` c
                INNER JOIN `pj_category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = 1 AND cl.id_shop = 2 )
                WHERE (c.`active` = 1 OR c.`id_category` = 2)
                ORDER BY c.`level_depth` ASC, cl.`name` ASC
                AND cs.`id_category` = c.`id_category` AND cs.`id_shop` = 2
                AND c.`id_category` != 1
                 AND `level_depth` <= 2
                AND c.id_category IN (SELECT id_category FROM `pj_category_group` WHERE `id_group` IN (3));
    

    总而言之,您需要在SELECT 命令的上下文中使用ORDER BY,在这种情况下,使用WHEREFROMINNER JOIN

    【讨论】:

      【解决方案4】:

      Sql Feature Order by 顾名思义,用于根据以下语法中提到的列对选定列进行排序: 按 Column_Name ASC/DESC 排序

      因此,如果您不添加您决定在 select 子句中检索订单数据集所使用的列,您将收到此错误。

      【讨论】:

      • 谢谢 Jayesh。但我的查询将在低于 5.7 版本的 mysql 中工作。
      【解决方案5】:

      在这里将一些线程链接在一起 - 我相信这与 mysql 版本(我们能够使用 5.7 绕过)和/或严格模式有关:https://github.com/publiclab/plots2/pull/8145

      谢谢!

      【讨论】:

        【解决方案6】:

        有一种方法可以绕过它。 这不是最好的做法(我认为它更糟......但如果你无法控制你的 SQL_MODE 它应该可以工作):

        SELECT DISTINCT d.id_parent, d.id_category, d.name, d.description, d.link_rewrite
                FROM (select c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite
                FROM   `pj_category_shop` cs, `pj_category` c
                INNER JOIN `pj_category_lang` cl ON (c.`id_category` = cl.`id_category` AND cl.`id_lang` = 1 AND cl.id_shop = 2 )
                WHERE (c.`active` = 1 OR c.`id_category` = 2)
                ORDER BY c.`level_depth` ASC, cl.`name` ASC
                AND cs.`id_category` = c.`id_category` AND cs.`id_shop` = 2
                AND c.`id_category` != 1
                 AND `level_depth` <= 2
                AND c.id_category IN (SELECT id_category FROM `pj_category_group` WHERE `id_group` IN (3))) as d ;
        

        【讨论】:

          猜你喜欢
          • 2017-05-04
          • 1970-01-01
          • 2016-06-10
          • 2017-02-14
          • 2018-06-12
          • 2016-10-23
          • 2017-06-22
          • 2017-12-13
          • 1970-01-01
          相关资源
          最近更新 更多