2017-05-18 4 views
-1

Ich möchte die Menge der Einkäufe nach NUR Stadt gruppiert zeigen. Aber ich möchte das Ergebnis auf diese Weise zeigen: Stadt -> Staat -> Menge. Genau wie folgt aus:Gruppe nach Fehler in meiner MySQL-Abfrage

Alabama Birmingham 80 
Alabama Montgomery 100 

So schreibe ich diese Anfrage:

select state, city, count(*) from address 
inner join person inner join purchase 
where purchase.person_FK = person.id and address.person_FK = person.id 
group by city 
order by state, city; 

Aber dann bekam ich diese Fehlermeldung: „Fehlercode: 1055. Expression # 1 von SELECT-Liste nicht auf group by-Klausel und nicht-Aggregat-Spalte ‚v2.address.state‘ enthält Hexe funktionell nicht auf Spalten in der Gruppe abhängig von Klausel dies mit sql_mode unvereinbar ist = only_full_group_by“

Könnt ihr mir helfen?

+2

Warum möchten Sie nicht nach 'state' gruppieren, wenn Sie offensichtlich nach' state' gruppieren müssen? Wenn Sie nicht nach "Staat" gruppieren, was passiert dann mit Montgomery, Massachusetts; Montgomery, Minnesota; und Montgomery, Vermont? – SqlZim

+0

Was? Ich möchte nach Stadt gruppieren, nicht Staat – flpn

+0

Sie möchten nach 'Stadt' ** und **' Staat' gruppieren - https://dev.mysql.com/doc/refman/5.7/en/sql-mode.html #sqlmode_only_full_group_by - und 'order by state, city, count (*)' –

Antwort

1

group by beide.

select state, city, count(*) from address 
inner join person inner join purchase 
where purchase.person_FK = person.id and address.person_FK = person.id 
group by state, city 
order by state, city; 
+0

Danke, Mann! Es hat funktioniert ... Aber kannst du mir erklären, warum ich das machen muss? – flpn

+1

@flpn Sie müssen Spalten gruppieren, die Sie nicht aggregieren. Die einzige andere Möglichkeit wäre, 'state' mit' max() 'oder' min() 'oder etwas zu aggregieren, und das ist eine schlechte Wahl, da Sie mehrere Statiskäufe in einen hinzufügen werden. – SqlZim

+0

Ich hatte das gleiche Problem mit einer Bestellung per Befehl in einer anderen Abfrage. Ich möchte den Namen anzeigen -> Menge -> Gesamtpreis, sortiert nach Preis. Kannst du mir helfen? – flpn

1

können Sie haben die gleichen Ortsnamen in mehreren Staaten, deshalb müssen Sie Gruppe durch den Staat als auch, sonst kann mysql nicht entscheiden, welcher Staat neben dem Stadtnamen anzuzeigen.

1

In Ihrem Fall gruppieren Sie nur nach Bundesland und Stadt. Das ist vollkommen in Ordnung, denn Stadt hängt voll und ganz vom Staat ab.

Um die allgemeinere Frage dahinter zu beantworten, lassen Sie mich ein fortgeschritteneres Beispiel zeigen.

Stellen Sie sich vor, Sie haben zwei Tabellen:

table1 (Dimension, value)

table2 (Dimension, moreinfo1, moreinfo2, ..., moreinfon)

Dann möchten Sie nicht haben etwas wie group by dimension, moreinfo1, moreinfo2, ....

Die Lösung ist die Aggregation in einen CTE zu setzen und kommen danach:

with aggr as (
    select dimension, avg(value) 
    from table1 
    group by dimension 
) 
select * 
from aggr join table2 using (dimension) 

Wenn Sie keine using-Klausel in der SQL-Dialekt haben, benutzen Sie einfach, was in Ihrer Umgebung üblich ist.

1

Mit Abstand sind alle Vorschläge über Group By state, city tatsächlich korrekt.

aber um Ihre Frage zu beantworten, ist in MySQL 5.7+ der SQL-Modus "only_full_group_by" standardmäßig aktiviert. Das bedeutet, wenn Sie Ihre Ergebnisse zusammen gruppieren, ALLE Felder, die Sie in Ihrer SELECT-Anweisung anzeigen muss zu einem aggregierten Ergebnis führen. Z.B. SUM(), MAX(), MIN(), COUNT(), ect ...

In Ihrem Fall wird "state" als Standardergebnis belassen. Kurz gesagt, Sie haben keine Garantie auf welches Ergebnis Sie werden in Ihre Spalte "Staat" gelangen. Sie könnten Massachusetts ODER Minnesota wie oben erwähnt bekommen.

Alles was gesagt wird, wenn Sie immer noch nicht wollen, dass dieser Fehler, verwenden Sie die folgenden, um diesen SQL-Modus zu deaktivieren.

Dies wird den Set-SQL-Modus für die Dauer Ihrer aktuellen MySQL-Verbindung entfernt.

Advisory:

Dies wird für die Prüfung hilfreich sein .. aber wenn Ihre Abfrage mit only_full_group_by ON nicht funktioniert, stehen die Chancen sehr hoch Sie etwas tun, Sie wollen nicht getan.