web-dev-qa-db-fra.com

Incompatibilité avec Mysql 5.7 (L'expression n ° 1 de la clause ORDER BY n'est pas dans la liste SELECT)

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 .. ??

10
Suriya Kumar

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'
18
Suriya Kumar

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.

1
Jayesh Mulwani

SELECT DISTINCT c.id_parent, c.id_category, cl.name, cl.description, cl.link_rewrite FROMpj_category_shopcs,pj_categoryc INNER JOINpj_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 ANDlevel_depth<= 2 AND c.id_category IN (SELECT id_category FROMpj_category_groupWHEREid_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.

0
Heinan Cabouly