Несовместимость с Mysql 5.7 (выражение № 1 предложения ORDER BY не находится в списке SELECT)

Когда я выполняю следующий запрос, я получил Exception

Код ошибки: 3065 Выражение # 1 предложения ORDER BY не в 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;

Я не понимаю, почему это происходит..??

Ответ 1

Я нашел ответ на свой вопрос. Фактически mysql 5.7 содержит " ONLY_FULL_GROUP_BY" в режиме sql. Поэтому мы не можем выполнить orderby в элементе, который не находится в списке select.we измените его из

'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'

Ответ 2

Столбец

ORDER BY должен быть столбцом, указанным в списке SELECT

Добавьте c.level_depth в свой список выбора

Try:

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;

Ответ 3

Sql Feature Order by - это имя, которое предлагается использовать для заказа выбранных столбцов на основе столбца, указанного в следующем синтаксисе: Порядок по столбцу_Name ASC/DESC

Итак, если вы не добавите столбец, в котором вы решили получить набор заказов в предложении select, вы получите эту ошибку.

Ответ 4

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));

Подводя итог, вы должны иметь ORDER BY в контексте команды SELECT, в этом случае, с WHERE, FROM и INNER JOIN.