sql >> Databáze >  >> RDS >> Mysql

Chyba MySQL:Seznam SELECT není v klauzuli GROUP BY

Když použijete GROUP BY, můžete použít výrazy ve svém výběrovém seznamu pouze v případě, že mají jednu hodnotu na skupinu. Jinak dostanete nejednoznačné výsledky dotazu.

Ve vašem případě se MySQL domnívá, že s.status může mít více hodnot na skupinu. Seskupujete například podle p.products_id ale s.status je sloupec v jiné tabulce speciální , možná ve vztahu jeden k mnoha s tabulkami produkty . Takže ve speciálech může být více řádků se stejným products_id , ale jiné hodnoty pro status . Pokud tomu tak je, která hodnota pro status měl by dotaz použít? Je to nejednoznačné.

Ve vašich datech se může stát, že omezíte řádky tak, že budete mít pouze jeden řádek v speciálech pro každý řádek v produktech . MySQL však tento předpoklad nemůže učinit.

MySQL 5.6 a starší vám umožňují psát takové nejednoznačné dotazy a důvěřovat, že víte, co děláte. Ale MySQL 5.7 ve výchozím nastavení umožňuje přísnější vynucování (to může být méně přísné, aby se chovalo jako dřívější verze).

Oprava spočívá v dodržení tohoto pravidla:Každý sloupec ve vašem výběrovém seznamu musí spadat do jednoho ze tří případů:

  • Sloupec je uvnitř agregační funkce jako COUNT(), SUM(), MIN, MAX(), AVERAGE() nebo GROUP_CONCAT().
  • Sloupec je jedním ze sloupců pojmenovaných v GROUP BY doložka.
  • Sloupec je funkčně závislý na sloupcích pojmenovaných v GROUP BY doložka.

Pro další vysvětlení si přečtěte tento vynikající blog:Debunking GROUP BY myths

Pokud jde o váš komentář, mohu jen odhadovat, protože jste nezveřejnili své definice tabulek.

Hádám, že products_description a výrobci jsou funkčně závislé na produktech , takže je v pořádku uvést je tak, jak jsou ve výběrovém seznamu. Ale tento předpoklad nemusí být správný, neznám vaše schéma.

Každopádně chyba o s.status by měla být vyřešena pomocí agregační funkce. Používám MAX() jako příklad.

Také jsem přepsal vaše příspěvky správným způsobem. Je třeba se vyhnout spojování ve stylu čárky.



  1. vnitřní spojení a výkon klauzule where in()?

  2. Jak automaticky zavřít nečinná připojení v PostgreSQL?

  3. Předávání datové tabulky jako parametru do uložených procedur

  4. SQLite MEZI