与Mysql 5.7不兼容(ORDER BY子句的表达式#1不在SELECT列表中)

Sur*_*mar 12 php java mysql xampp angularjs

当我执行以下查询时,我收到了异常

错误代码:3065 ORDER BY子句的表达式#1不在SELECT列表中,引用列'webstore.level_depth'不在SELECT列表中; 这与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;
Run Code Online (Sandbox Code Playgroud)

我不明白为什么会发生这种情况.. ??

Sur*_*mar 21

我找到了我的问题的答案.实际上 mysql 5.7 在sql模式中包含' ONLY_FULL_GROUP_BY '.所以我们不能在不在select list中的元素中执行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' 
Run Code Online (Sandbox Code Playgroud)

成

'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
Run Code Online (Sandbox Code Playgroud)

我们可以通过执行以下查询来完成此操作

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'
Run Code Online (Sandbox Code Playgroud)


Pra*_*ran 4

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;
Run Code Online (Sandbox Code Playgroud)