MySQL: Summe GROUP BY MIT ROLLUP Neugier
Ich habe zwei Abfragen. Eine davon macht Sinn für mich, die anderen nicht. Erste:
SELECT gender AS 'Gender', count(*) AS '#'
FROM registrations
GROUP BY gender WITH ROLLUP
Dass mir dies:
Gender #
Female 20
Male 19
NULL 39
So, ich bekomme die Zählung und die Gesamtzahl. Was ich erwartet habe. Nächsten:
SELECT c.printable_name AS 'Country', count(*) AS '#'
FROM registrations r
INNER JOIN country c ON r.country = c.country_id
GROUP BY country WITH ROLLUP
Country #
Denmark 9
Norway 10
Sweden 18
United States 1
Uzbekistan 1
Uzbekistan 39
Gleiche Ergebnis. Aber warum bekomme ich in Usbekistan für die gesamte??
Wie sicher sind Sie, dass ist nicht das Problem, wie die Ergebnisse angezeigt werden?
es passiert sowohl in meinem code, und in phpmyadmin die Sache. ich wünschte, ich könnte versuchen, es zu testen mit regelmäßigen mysql query browser " oder sowas, aber keinen Zugang haben.
Ich war nur Herumspielen mit Rollup zu. Ich denke, das problem hier ist, dass Sie sich für die Landes-id auf den Namen des Landes, so dass alle NULL-Werte nicht, die verbinden, und aus irgendeinem Grund halten den letzten Wert der name anstelle der nicht mit einem Namen.
es passiert sowohl in meinem code, und in phpmyadmin die Sache. ich wünschte, ich könnte versuchen, es zu testen mit regelmäßigen mysql query browser " oder sowas, aber keinen Zugang haben.
Ich war nur Herumspielen mit Rollup zu. Ich denke, das problem hier ist, dass Sie sich für die Landes-id auf den Namen des Landes, so dass alle NULL-Werte nicht, die verbinden, und aus irgendeinem Grund halten den letzten Wert der name anstelle der nicht mit einem Namen.
InformationsquelleAutor Svish | 2009-03-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Weil Sie nicht die Auswahl der Artikel, die Sie Gruppieren nach. Wenn Sie sagte:
Würden Sie bekommen, die erwarteten NULL. Jedoch sind Sie der Gruppierung nach einer anderen Spalte, so dass MySQL nicht wissen, dass printable_name ist die Teilnahme an einem rollup-Gruppe, und wählt jeder alte Wert aus dieser Spalte, in der Verknüpfung von alle Registrierungen. (So ist es möglich, Sie werden sehen, andere Länder als Usbekistan.)
Dies ist Teil eines umfassenderen Problems, mit MySQL als Freizügig, was Sie AUSWÄHLEN können in einer GROUP BY-Abfrage. Zum Beispiel können Sie sagen:
- und MySQL-gerne Holen einen der geschlechtsspezifischen Werte für eine Registrierung von jedem einzelnen Land, auch wenn es keinen direkten kausalen link (aka "funktionale Abhängigkeit") zwischen Land und Geschlecht. Andere DBMS wird sich weigern den oben genannten Befehl mit der Begründung, es ist nicht garantiert, nur ein Geschlecht pro Land.(*)
Nun, dies:
ist OK, weil es eine funktionale Abhängigkeit zwischen r.Land-und-c -.printable_name (vorausgesetzt, Sie haben es richtig beschrieben, deine country_id als PRIMARY KEY).
Aber MySQL ist MIT ROLLUP-Erweiterung ist ein bisschen ein hack in der Art, wie es funktioniert. Auf das rollup-Reihe Bühne am Ende, es läuft über die gesamte pre-grouping-Ergebnis-set zu greifen, seine Werte und dann setzt die group-by-Spalte auf NULL. Es nicht auch null andere Spalten, die eine funktionale Abhängigkeit in dieser Spalte. Es sollte wohl, aber MySQL derzeit nicht wirklich verstehen, die ganze Sache über funktionale Abhängigkeiten.
Also, wenn Sie wählen.c.printable_name es wird Ihnen zeigen, welches Land den Namen Wert, den es nach dem Zufallsprinzip ausgewählt, und wählen Sie c.country_id es wird Ihnen zeigen, welche Land-ID nach dem Zufallsprinzip ausgewählt, obwohl c.country_id ist die join-Kriterium, so muss der gleiche wie r ist.Land, das ist NULL!
Was Sie tun können, um das problem zu umgehen ist:
(*: MySQL hat eine option SQL_MODE ONLY_FULL_GROUP_BY soll, um dieses Problem zu beheben, aber es geht viel zu weit und nur können Sie die Spalten auswählen aus die GRUPPE DURCH, die nicht Spalten, die eine funktionale Abhängigkeit von der GRUPPE. So wird es gültig Abfragen fehl, sodass es in der Regel nutzlos.)
InformationsquelleAutor bobince
Coz, wenn Sie die JOIN-Methode, die folgende NULL-element des array mit dem Wert der vorherigen NICHT-NULL-element. Aber Im nicht sicher. Das ist meine Erfahrung, wenn ich es in PHP.
hm... es ist ein anderes problem... 'Land' nicht sein, denn es ist der name der Tabelle. So ändern Sie für etwas anderes. Dann das Letzte Ergebnis zeigt NULL.
Hier ist mein Vorschlag:
dies ist einfach seltsam... ich weiß nicht, haha. also, wenn ich ALS "countryp' und der GRUPPE VON countryp es funktioniert. Wenn ich mit 'name', gibt es nicht. Wenn ich 'qe' es nicht...
InformationsquelleAutor Bajlo
Diese drucken würde 'Insgesamt Registrierung = 39', und wäre die Letzte Zeile/Datensatz.
InformationsquelleAutor hdk