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.