sql >> Databasteknik >  >> RDS >> Mysql

MySQL-fel:SELECT-listan finns inte i GROUP BY-satsen

När du använder GROUP BY kan du bara använda uttryck i din vallista om de har ett enda värde per grupp. Annars får du tvetydiga frågeresultat.

I ditt fall anser MySQL att s.status kan ha flera värden per grupp. Till exempel, du grupperar efter p.products_id men s.status är en kolumn i en annan tabell specials , kanske i en en-till-många-relation med tabell products . Så det kan finnas flera rader i specials med samma products_id , men olika värden för status . Om så är fallet, vilket värde för status ska frågan användas? Det är tvetydigt.

I dina data kan du råka begränsa raderna så att du bara har en rad i specials för varje rad i products . Men MySQL kan inte göra det antagandet.

MySQL 5.6 och tidigare låter dig skriva så tvetydiga frågor, i tillit till att du vet vad du gör. Men MySQL 5.7 möjliggör mer strikt tillämpning som standard (detta kan göras mindre strikt för att bete sig som tidigare versioner).

Fixningen är att följa denna regel:Varje kolumn i din urvalslista måste falla i ett av tre fall:

  • Kolumnen finns i en aggregerad funktion som COUNT(), SUM(), MIN, MAX(), AVERAGE() eller GROUP_CONCAT().
  • Kolumnen är en av kolumnerna som namnges i GROUP BY klausul.
  • Kolumnen är funktionellt beroende av kolumnen/kolumnerna som namnges i GROUP BY klausul.

För mer förklaring läs denna utmärkta blogg:Debunking GROUP BY myths

Angående din kommentar kan jag bara gissa eftersom du inte har lagt upp dina tabelldefinitioner.

Jag gissar att products_description och manufacturers är funktionellt beroende av products , så det är okej att lista dem som de är i urvalslistan. Men detta antagande kanske inte är korrekt, jag känner inte till ditt schema.

Hur som helst, felet om s.status bör lösas med hjälp av en aggregatfunktion. Jag använder MAX() som ett exempel.

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;

Jag skrev också om dina anslutningar på rätt sätt. Kommaliknande kopplingar bör undvikas.



  1. Vad är nytt i PostgreSQL 11

  2. Hur man väljer den senaste uppsättningen daterade poster från en mysql-tabell

  3. DNA vs moderna säkerhetskopieringsmetoder:Framtiden för datalagring

  4. if (välj antal (kolumn) från tabellen)> 0 då