MySQL Error: SELECT-Liste ist nicht in GROUP BY-Klausel
Ich habe ein problem mit meinem query und mysql wirft die folgende Fehlermeldung:
#1055 - Expression #66 of SELECT list is not in GROUP BY clause and contains nonaggregated column 's.status' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
Abfrage:
select p.*,
pd.*,
m.*,
IF(s.status, s.specials_new_products_price, null) as specials_new_products_price,
IF(s.status, s.specials_new_products_price, p.products_price) as final_price
FROM products p
LEFT JOIN specials s ON p.products_id = s.products_id
LEFT JOIN manufacturers m using(manufacturers_id) ,
products_description pd,
categories c,
products_to_categories p2c
WHERE p.products_view = 1
AND p.products_status = 1
AND p.products_archive = 0
AND c.virtual_categories = 0
AND p.products_id = pd.products_id
AND p.products_id = p2c.products_id
AND p2c.categories_id = c.categories_id
AND pd.language_id = 1
GROUP BY p.products_id;
InformationsquelleAutor kurama | 2016-08-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie GROUP BY verwenden, können Sie die Ausdrücke in der select-Liste nur, wenn Sie einen einzelnen Wert pro Gruppe. Andernfalls erhalten Sie mehrdeutige Abfrage Ergebnisse.
In Ihrem Fall, die MySQL glaubt, dass
s.status
können mehrere Werte pro Gruppe. Sind Sie zum Beispiel auf der Gruppierung vonp.products_id
abers.status
ist eine Spalte in einer anderen Tabellespecials
vielleicht in einer eins-zu-viele-Beziehung mit der Tabelleproducts
. So könnte es sein, mehrere Zeilen inspecials
mit der gleichenproducts_id
, aber unterschiedliche Werte fürstatus
. Wenn das der Fall ist, welcher Wert fürstatus
sollte die Abfrage verwenden? Es ist mehrdeutig.Ihrer Daten, die Sie passieren könnte, um beschränken Sie die Zeilen so, dass Sie nur eine Zeile in
specials
für jede Zeile inproducts
. Aber MySQL kann nicht davon ausgehen.MySQL 5.6 und früher lassen Sie schreiben, wie mehrdeutige Abfragen, im Vertrauen, dass Sie wissen, was Sie tun. Aber MySQL 5.7 ermöglicht eine strikte Durchsetzung standardmäßig (dies kann gemacht werden, weniger streng zu Verhalten wie in früheren Versionen).
Die fix ist, diese Regel befolgen: Jede Spalte in der select-Liste müssen, fallen in eine von drei Fällen:
GROUP BY
- Klausel.GROUP BY
- Klausel.Weitere Erklärung, Lesen Sie dieses ausgezeichnete blog: Widerlegung GRUPPE VON Mythen
Re dein Kommentar, kann ich nur vermuten, weil Sie keine Beiträge geschrieben haben, Ihre Tabelle Definitionen.
Ich vermute, dass
products_description
undmanufacturers
sind funktional abhängig vonproducts
, so ist es in Ordnung Sie als ist in der select-Liste. Aber diese Annahme kann nicht richtig sein, ich weiß nicht, Ihr schema.Sowieso, den Fehler zu
s.status
sollte gelöst werden, indem Sie eine Aggregatfunktion. Ich bin mitMAX()
als Beispiel.Ich auch schrieb sich die Verknüpfungen in der richtigen Weise. Comma-style-joins vermieden werden sollte.
Ich habe versucht, verschiedene Möglichkeit wie select SQL_CALC_FOUND_ROWS s.products_id, oder select SQL_CALC_FOUND_ROWS count(p.products_id), aber keine Lösung, keine Idee zu umschreiben ?
Sie versuchen die Aggregation der Spalte, die Sie gruppieren nach. Wie Bill beschrieben, die Sie benötigen, um sicherzustellen, dass die anderen Spalten in der Auswahlliste enthalten sind, enthalten die
GROUP BY
- Klausel, oder Sie aggregiert werden, oder sind sonst abhängig von einer Spalte gruppiert, so dass die Gruppierung funktioniert. Zum Beispielselect p.products_id, s.status, sum(p.products_price), ... from products p group by p.products_id, s.status
ok, ich bin auf der Suche, tk
InformationsquelleAutor Bill Karwin
Sind Sie versuchen zu tun, ein
ORDER BY
? DieGROUP BY
Klausel versucht, eine Zeile zurückgeben, für jeden eindeutigen Wert in der Spalte in derGROUP BY
- Klausel, es sei denn, Sie mehrere Spalten hinzufügen, um die Klausel. Der Fehler wird ausgelöst, weil Sie andere, nicht aggregierte Spalten, die nicht in der Klausel - aggregierte Spalten wäre so etwas wieMAX(p.products_id)
oderSUM(p.products_price)
. In der Abfrage gibt es mehrere Zeilen mit dem gleichen p.product_price und verschiedenen s.status-Werte, so dass dieGROUP BY
ist nicht sinnvoll.MySQL Group By-handling: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
Aggregatfunktionen: http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html
InformationsquelleAutor Daniel Langemann
Wenn Sie möchten, verwenden Sie GROUP BY auf eine bestimmte Spalte und bekommen die id ' s der Ergebnisse es gibt da einen schönen trick, wie es zu tun:
Ergebnis:
Nun haben Sie verschiedene Werte aus distinct_column und mit ihm die Werte der entsprechenden Zeile.
Quelle
Ich denke, dass die id und another_int_column haben, einzigartig zu sein, aber ich bin mir nicht sicher.
InformationsquelleAutor Chose