sql >> Database teknologi >  >> RDS >> Mysql

MySQL-fejl:SELECT-listen er ikke i GROUP BY-sætning

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.



  1. MySQL:Hvordan henter man en tilfældig række eller flere tilfældige rækker?

  2. Fatal fejl:Kald til udefineret funktion mysqli_result()

  3. dvale kunne ikke hente næste sekvensværdi

  4. PostgreSQL høj tilgængelighed med Master-Slave &Master-Master-arkitekturer