Несовместимость с 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
.