2017-01-04 47 views
5

Kiedy Wykonuje kwerendę follwoing Otrzymałem wyjątkiemNiezgodność z MySQL 5.7 (Expression # 1 z klauzuli ORDER BY nie jest w liście SELECT)

Kod błędu: 3065 Expression 1 z klauzuli ORDER BY jest nie na liście SELECT , odwołuje się do kolumny "webstore.level_depth", która nie znajduje się na liście SELECT na liście: ; to jest niezgodne z wyraźną

moje zapytanie

 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; 

ja nie rozumiem, dlaczego tak się dzieje .. ??

Odpowiedz

9

mam znaleźć odpowiedź na moje question.Actually mysql 5.7 zawiera "ONLY_FULL_GROUP_BY" w trybie sql. Więc nie możemy wykonać zamówienia w tym elemencie że nie jest w wybranych list.we musiał zmienić go z

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

do

'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' 

Możemy to zrobić, wykonując następujące zapytania

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

Właściwie powinieneś tylko wykonać jeden z nich. Zmienne GLOBAL wpływają na ogólne działanie serwera, a zmienne SESSION wpływają na operacje dla poszczególnych połączeń klientów. (https://dev.mysql.com/doc/refman/5.7/en/using-system-variables.html). – Andres

+0

Aby użyć wartości z MySQL 5.6, upuść wszystkie oprócz ostatniej opcji: 'ustawić globalny SQL_MODE =" NO_ENGINE_SUBSTITUTION ";' –

0

ORDER BY kolumna powinna być kolumna na liście SELECT

Dodaj c.level_depth w swoim liście select

Spróbuj:

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; 
+0

Dziękuję pradeep za szybką odpowiedź.Ale mam warunek Nie dokonuję zmian w moim zapytaniu. –

0

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. aktywny = 1 OR c. id_category = 2) ORDER BY c. level_depth ASC, cl. nazwa 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));

Podsumowując, trzeba mieć ORDER BY w kontekście polecenia SELECT, w którym to przypadku, z WHERE, FROM i INNER JOIN.

1

SQL Funkcja Zamówienie przez to jak sama nazwa wskazuje użyty zamówić wybranych kolumn na podstawie kolumny podaną w poniższej składni: Zamówienia nazwa_kolumny ASC/DESC

Więc jeśli nie dodajemy kolumna, w której zdecydowałeś się pobrać zestaw danych zamówienia w klauzuli select, otrzymasz ten błąd.

+0

Dzięki Jayesh.Ale moje zapytanie będzie działać w mysql, które są poniżej liczby wersji 5.7. –