Når du bruger GROUP BY, kan du kun bruge udtryk i din valgliste, hvis de har en enkelt værdi pr. gruppe. Ellers får du tvetydige forespørgselsresultater.
I dit tilfælde mener MySQL, at s.status
kan have flere værdier pr. gruppe. For eksempel grupperer du efter p.products_id
men s.status
er en kolonne i en anden tabel specials
, måske i et en-til-mange forhold med tabel produkter
. Så der kan være flere rækker i specials
med det samme products_id
, men forskellige værdier for status
. Hvis det er tilfældet, hvilken værdi for status
skal forespørgslen bruge? Det er tvetydigt.
I dine data kan du tilfældigvis begrænse rækkerne, så du kun har én række i special
for hver række i produkter
. Men MySQL kan ikke gøre den antagelse.
MySQL 5.6 og tidligere lader dig skrive så tvetydige forespørgsler i tillid til, at du ved, hvad du laver. Men MySQL 5.7 muliggør mere streng håndhævelse som standard (dette kan gøres mindre streng for at opføre sig som tidligere versioner).
Rettelsen er at følge denne regel:Hver kolonne i din valgliste skal falde ind i et af tre tilfælde:
- Kolonnen er inde i en aggregeret funktion som COUNT(), SUM(), MIN, MAX(), AVERAGE() eller GROUP_CONCAT().
- Kolonnen er en af kolonnerne, der er navngivet i
GROUP BY
klausul. - Kolonnen er funktionelt afhængig af den eller de kolonner, der er navngivet i
GROUP BY
klausul.
For mere forklaring læs denne fremragende blog:Debunking GROUP BY myths
Med hensyn til din kommentar kan jeg kun gætte, fordi du ikke har lagt dine tabeldefinitioner op.
Jeg gætter på, at products_description
og producenter
er funktionelt afhængige af produkter
, så det er okay at liste dem, som de er på valglisten. Men denne antagelse er muligvis ikke korrekt, jeg kender ikke dit skema.
Uanset hvad, fejlen om s.status
skal løses ved at bruge en aggregeret funktion. Jeg bruger MAX()
som et eksempel.
VÆLG s.*,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_priceFROM products p LEFT OUTER JOIN specials s ON p.products_id =s.products_id INNER JOIN-producenter m ON p.manufacturers_id =m.manufacturers_idINNER JOIN products_description pd ON p.products_products_ON products_id_ON p.cd. products_id =p2c.products_idINNER JOIN-kategorier c PÅ p2c.categories_id =c.categories_idWHERE p.products_view =1 OG p.products_status =1AND p.products_archive =0AND c.virtual_categories =0AND pd.language_id =p.>
Jeg omskrev også dine joins på den rigtige måde. Komma-lignende joinforbindelser bør undgås.