Brauche Hilfe bei einer MYSQLAbfrage
-
Hallo!
Ich benötige eure Hilfe bei einer MySQL-Abfrage.Ich habe 2 Tabellen.
Eine Tabelle: Personen.
Hier steht zB der Name der Person mit einer ID. (Felder: ID Name Nachname)Dann habe ich eine weitere Tabelle: Personenwerte (Felder: ID Groesse Alter)
nun gibt es zu jeder Person mehrere Werte in der Tabelle Personenwerte. Zu jeder Größe ein anderes Alter.
Nun möchte ich eine Statistik ausgeben lassen, die anzeigt, wie viele Personen eine maximale Groesse von ca. 165, 166, 167, 168 cm haben.
Aber das alles nur mit 4 MySQL Abfragen (geht hier um ein Geschwindigkeitsproblem...mit Code allein könnte ich das lösen, allerdings zu langsam. Ist nämlich ein vereinfachtes Problem mit über 100k Datensätzen, bei denen die Programmierlösung über 5 Minuten dauert.).Ich dachte an so etwas:
SELECT Count(Personen.ID) WHERE MAX(Personenwerte.Groesse)=165 AND Personenwerte.ID=Personen.ID FROM Personen, Personenwerte
leider funktioniert das nicht. Wisst ihr denn was ich meine, und wie man das in einem Query realisieren könnte?
Danke,
Gruß,
KevinEDIT:
Mir würde auch ein Query reichen, welches mir anzeigt wie viele Personen eine maximale Größe zwischen 165 und 167 haben. Weiß das denn jemand?
-
Sofern ich dich richtig verstanden habe, suchst du die Anzahl der Peronen, deren maximale (Körper?)Größe zwischen zwei vorgegebenen Variablen liegt. Oder als Frage formuliert: Wieviele Leute existieren in meiner Tabelle, deren allerhöchste Größe zwischen X und Y liegt.
Damit du weniger Schwierigkeiten beim Verstehen meiner Lösung hast, zeige ich dir zunächst mal eine Abfrage die alle Personen und ihre maximale Größe auflistet.
SELECT Personen.Name, MAX(Personenwerte.Groesse) AS Maximalgroesse FROM Personen, Personenwerte WHERE Peronen.ID = Personenwerte.ID GROUP BY Personen.ID
Mögliches Resultat:
Name | Maximalgroesse --------------------- Huber | 167 Schuber| 169 Höller | 170 Herr | 164 Matt | 165
Aggregatsfunktionen wie MAX, MIN, AVG, COUNT etc. lassen sich meistens nur in Verbindung mit der GROUP BY-Klausel verwenden. In simplen Abfragen, w.z.B. "SELECT MAX(ID) FROM Articles", kann man sich das GROUP BY jedoch sparen, da die Engine klug genug ist um solche Situationen zu erkennen.
Die Abfrage, die du suchst kann folgendermaßen aussehen:
SELECT NULL FROM Personen, Personenwerte WHERE MAX(Personenwerte.Groesse) BETWEEN 165 AND 167 AND Personenwerte.ID=Personen.ID GROUP BY Personen.ID
Es ist nicht nötig irgendwas in der SELECT-Klausel zu selektieren, da du ja nur an der Anzahl der Tupel (=Anzahl der Personen, die deine Kriterien erfüllen) interessiert bist, welche diese Abfrage produziert. Du musst diese Zahl also nur mit der MySQLI-API herausfinden (in PHP gibts dafür ja die mysql_num_rows-Funktion bzw. das num_rows-Attribut in der mySQLi-Schnittstelle).
Wenn du außerdem auch Personen finden möchtest, deren maximale Größe einer Reihe von vorgegebenen Werten entspricht, dann empfiehlt sich statt dem BETWEEN-Operator den IN-Operator zu verwenden:
SELECT NULL FROM Personen, Personenwerte WHERE MAX(Personenwerte.Groesse) IN(165, 167, 169) AND Personenwerte.ID=Personen.ID GROUP BY Personen.ID
-
Vielen Dank!