Eine DB-Abfrage statt zweien...
Eddie
- datenbank
0 Nachtrag :-/
Eddie0 Gonzo
0 Ilja
Hallo allerseits,
ich habe gerade ein bloedes Problem, und frage mich, wie ich das mit einer einzigen DB-Abfrage lösen kann! Müsste meiner Meinung nach gehen, nur wie???
Folgende Tabelle familyMember habe ich (ok, ist ein vereinfachtes Beispiel):
familyMember:
id
isFather
familyName
Ich möchte jetzt die 10 größten Familien finden und anschließend die Väter (gibt's pro Familie nur einmal) als Datensatz zurückbekommen!
Bisher mache ich das so:
SELECT familyMember.familyName, COUNT( * ) AS count
FROM familyMember
GROUP familyMember.familyName
ORDER BY count DESC
LIMIT 0 , 10
Anschließend kommen die gefunden Familiennamen hier rein, wobei ich noch nicht rausgefunden habe, wie ich dieselbe "ORDER BY"-Reihenfolge wie oben erhalte:
SELECT *
FROM familyMember
WHERE familyName IN (... hier die Ergebnisse der ersten Abfrage...)
Lässt sich das nicht irgendwie kombinieren?
Danke für eure Hilfe,
Eddie
Ups, die zweite Abfrage muss natuerlich so heissen:
SELECT *
FROM familyMember
WHERE isFather = 1 AND familyName IN (... hier die Ergebnisse der ersten Abfrage...)
Eddie
SELECT *
FROM familyMember
WHERE isFather = 1 AND familyName IN (... hier die Ergebnisse der ersten Abfrage...)
Du bist nah dran, packe die erstgenannte Abfrage in ein weiteres SELECT und dieses dann in die IN-Bedingung.
yo,
Ich möchte jetzt die 10 größten Familien finden und anschließend die Väter (gibt's pro Familie nur einmal) als Datensatz zurückbekommen!
das problem mit mysql und seinen funktionen wie LIMIT ist, dass man sehr schnell in eine Falle tappen kann. man muss sich zumindest allen problemen bewußt sein. hier wäre es der fall, wenn mehrere familien die gleiche größe aufweisen und diese alle auf den "10 ten" platz landen würden. dann schneidest du familien ab. das wäre so, als wenn es bei olympia zwei dritte plätze gibt und nur eine die bronze medaillie erhält. das kann so gewollt sein, muss aber bedacht sein.
nun aber zu deinem eigentlich problem. zwar kannst du keine unterabfrage verwenden, hast die lösung aber schon selbst gesagt, musst sie nur noch umsetzen. du nimmst einfach deine erste abfrage mit dem group by. der clou ist, dass es pro familie nur einen vater gibt, dessen namen du ja haben willst. diese kombination kombiniert mit der isFather spalte, einer IF flusssteuerung oder NULL Prüfung, gut geschüttelt und dann mit einer MIN oder MAX Aggregation (beides geht, da es eh nur einen wert gibt) gewürtzt, e viola, hast du alles in einer abfrage ohne unterabfrage.
Ilja