Quand j'exécute la requête suivante, j'ai reçu l'exception
Code d'erreur: 3065 L'expression n ° 1 de la clause ORDER BY ne figure pas dans la liste SELECT , Référence à la colonne 'webstore.level_depth' qui ne figure pas dans la liste SELECT; c'est incompatible avec DISTINCT
Ma question
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;
Je ne comprends pas pourquoi cela se passe .. ??
J'ai trouvé la réponse à ma question.En fait, mysql 5.7 contient ' ONLY_FULL_GROUP_BY ' en mode sql. Nous ne pouvons donc pas commander dans l'élément qui n'est pas dans la liste de sélection.Nous devons changer de
'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'
dans
'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
Nous pouvons le faire en exécutant les requêtes suivantes
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'
La colonne ORDER BY
doit figurer dans la liste SELECT
Ajouter c.level_depth
dans votre liste de sélection
Essayer:
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;
Sql Feature Order by est, comme son nom l’indique, utilisé pour ordonner les colonnes sélectionnées sur la base de la colonne mentionnée dans la syntaxe ci-dessous: Order by Column_Name ASC/DESC
Donc, si vous n'ajoutez pas la colonne à l'aide de laquelle vous avez décidé de récupérer un ensemble de données de commande dans la clause select, vous obtiendrez cette erreur.
SELECT DISTINCT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite
FROM
pj_category_shopcs,
pj_categoryc
INNER JOIN
pj_category_langcl ON (c.
id_category= cl.
id_categoryAND cl.
id_lang= 1 AND cl.id_shop = 2 )
WHERE (c.
active= 1 OR c.
id_category= 2)
ORDER BY c.
level_depthASC, cl.
nameASC
AND cs.
id_category= c.
id_categoryAND cs.
id_shop= 2
AND c.
id_category!= 1
AND
level_depth<= 2
AND c.id_category IN (SELECT id_category FROM
pj_category_groupWHERE
id_groupIN (3));
Pour résumer, vous devez avoir ORDER BY dans le contexte de la commande SELECT, auquel cas, avec WHERE, FROM et INNER JOIN.