sql >> Database >  >> RDS >> Mysql

MySQL-fout:SELECT-lijst staat niet in GROUP BY-clausule

Wanneer u GROUP BY gebruikt, kunt u alleen expressies in uw selectielijst gebruiken als ze één waarde per groep hebben. Anders krijg je onduidelijke zoekopdrachtresultaten.

In uw geval is MySQL van mening dat s.status kan meerdere waarden per groep hebben. U groepeert bijvoorbeeld op p.products_id maar s.status is een kolom in een andere tabel specials , misschien in een een-op-veel-relatie met tabel products . Er kunnen dus meerdere rijen zijn in specials met dezelfde products_id , maar verschillende waarden voor status . Als dat het geval is, welke waarde voor status moet de query gebruiken? Het is dubbelzinnig.

In uw gegevens kan het zijn dat u de rijen beperkt, zodat u slechts één rij heeft in specials voor elke rij in products . Maar MySQL kan die veronderstelling niet maken.

Met MySQL 5.6 en eerder kunt u dergelijke dubbelzinnige zoekopdrachten schrijven, erop vertrouwend dat u weet wat u doet. Maar MySQL 5.7 maakt standaard striktere handhaving mogelijk (dit kan minder streng worden gemaakt om zich als eerdere versies te gedragen).

De oplossing is om deze regel te volgen:elke kolom in uw selectielijst moet in een van de volgende drie gevallen vallen:

  • De kolom bevindt zich in een statistische functie zoals COUNT(), SUM(), MIN, MAX(), AVERAGE() of GROUP_CONCAT().
  • De kolom is een van de kolom(men) genoemd in de GROUP BY clausule.
  • De kolom is functioneel afhankelijk van de kolom(men) genoemd in de GROUP BY clausule.

Lees voor meer uitleg deze uitstekende blog:GROUP BY mythen ontkrachten

Wat betreft je opmerking, ik kan alleen maar gissen omdat je je tabeldefinities niet hebt gepost.

Ik vermoed dat products_description en manufacturers zijn functioneel afhankelijk van products , dus het is prima om ze op te sommen zoals ze in de selectielijst staan. Maar deze aanname is misschien niet correct, ik ken je schema niet.

Hoe dan ook, de fout over s.status moet worden opgelost met behulp van een aggregatiefunctie. Ik gebruik MAX() als voorbeeld.

SELECT p.*,
pd.*,
m.*,
MAX(IF(s.status, s.specials_new_products_price, NULL)) 
  AS specials_new_products_price,
MAX(IF(s.status, s.specials_new_products_price, p.products_price)) 
  AS final_price
FROM products p 
LEFT OUTER JOIN specials s ON p.products_id = s.products_id  
INNER JOIN manufacturers m ON p.manufacturers_id = m.manufacturers_id
INNER JOIN products_description pd ON p.products_id = pd.products_id
INNER JOIN products_to_categories p2c ON p.products_id = p2c.products_id
INNER JOIN categories c ON p2c.categories_id = c.categories_id
WHERE p.products_view = 1  
AND p.products_status = 1
AND p.products_archive = 0
AND c.virtual_categories = 0
AND pd.language_id = 1
GROUP BY p.products_id;

Ik heb je joins ook op de juiste manier herschreven. Samenvoegingen in kommastijl moeten worden vermeden.



  1. MySQL - alle records bijwerken zodat ze overeenkomen met de maximale waarde in de groep

  2. MySQL:VEREIST SSL niet weergegeven in subsidies

  3. MySQL-type voor het opslaan van een jaar:Smallint of Varchar of datum?

  4. Waarom invoegen-selecteren naar variabele tabel van XML-variabele zo traag?