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.