web-dev-qa-db-ja.com

Mysql 5.7との非互換性(ORDER BY句の式#1がSELECTリストにない)

次のクエリを実行すると、例外が発生しました

エラーコード:3065 ORDER BY句の式#1がSELECTリストにありません。SELECTリストにない列 'webstore.level_depth'を参照しています。これは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;

なぜこれが起こっているのか分かりません。

14
Suriya Kumar

私の質問に対する答えが見つかりました。実際には、mysql 5.7にはSQLモードで「ONLY_FULL_GROUP_BY」が含まれているため、できません。選択リストにない要素で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' 

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

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;

Sql Feature Order byは、次の構文で言及されている列に基づいて、選択された列を順序付けるために使用される名前が示すとおりです。構文:Column_Nameによる順序ASC/DESC

そのため、select句でデータの順序セットを取得することにしたカラムを追加しないと、このエラーが発生します。

1
Jayesh Mulwani
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 BYSELECTコマンドのコンテキストで、その場合、WHEREFROMおよびINNER JOIN

0
Heinan Cabouly