Eddie: Eine DB-Abfrage statt zweien...

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

--
Old men and far travelers may lie with authority.
  1. Ups, die zweite Abfrage muss natuerlich so heissen:

      
       SELECT *  
       FROM familyMember  
       WHERE isFather = 1 AND familyName IN (... hier die Ergebnisse der ersten Abfrage...)  
    
    

    Eddie

    --
    Old men and far travelers may lie with authority.
    1. 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.
      
  2. 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