Svenchen: MySql : Beste Lösung für Abfrage über mehrere Tabellen

Hallo,

ich bin mir nicht sicher was die beste(n) Abfrage(n?) für folgendes Problem ist.

Tabellen(Kurzfassung mit Beispieldaten) die bisher gegeben sind:
Tabelle "kinder"
| kindid | elternid | nachname   | vorname    | gebdatum     | betreuungszeit | gruppenid  | aufnahme_ab   | kuendigung_zum  | aktiviert |
| 1      | 1        | Amuster    | Amy        | 2008-09-20   | 6              | 1       | 2010-07-01    | 2011-09-01      |     1     |
| 2      | 2        | Bmuster    | Bert       | 2007-01-06   | 8              | 2       | 2008-01-01    | 0000-00-00      |     1     |
| 3      | 3        | Cmuster    | Celine     | 2005-08-19   | 10             | 2       | 2006-05-01    | 0000-00-00      |     1     |
| 4      | 1        | Amuster    | Dennis     | 2009-11-03   | 8              | 2       | 2006-09-01    | 0000-00-00      |     1     |
| 5      | 4        | Emuster    | Elena      | 2009-03-17   | 10             | 1       | 2009-10-01    | 0000-00-00      |     0     |
| 6      | 5        | Fmuster    | Falko      | 2006-08-16   | 6              | 3       | 2007-01-01    | 0000-00-00      |     1     |

Tabelle "eltern"
| elternid | anrede  | nachname_e1 | vorname_e1 | nachname_e2 | vorname_e2 | straße          | plz   | ort          |
| 1        | Familie | Amuster     | Anne       | Amuster     | Andre      | Allee 3         | 00345 | Musterstadt  |
| 2        | Frau    | Bmuster     | Birgit     |             |            | Baumweg 16      | 00345 | Musterstadt  |
| 3        | Herr    | Cmuster     | Cris       |             |            | Celler Str. 39a | 00346 | Musterhausen |
| 4        | Familie | Emuster     | Elke       | Ecke        | Emil       | Edenweg 12      | 00346 | Musterhausen |
| 5        | Familie | Fmuster     | Fiona      | Fmuster     | Friedrich  | Feldstr. 99     | 00345 | Musterstadt  |

Tabelle "gruppen"
| gruppenid | bezeichnung |
| 1         | Krümel      |
| 2         | Zwerge      |
| 3         | Spatzen     |
| 4         | Bienen      |

Abfrage bisher nach Namen, Betreuungszeit und Adresse aller Kinder der Gruppe z.B. 1 ab Datum z.B. 01.09.2011:

  
SELECT CONCAT(t1.nachname,', ',t1.vorname) AS name, t1.betreuungszeit, t1.aufnahme_ab, t1.kuendigung_zum, CONCAT(t2.straße,' - ', t2.plz,' ', t2.ort) AS adresse  
FROM kinder AS t1, eltern AS t2  
WHERE t2.elternid = t1.elternid  
AND t1.gruppeid = 1  
AND t1.betreuungszeit > 0  
AND t1.aktiviert =1  
AND t1.aufnahme_ab <= '2011-09-01'  
AND (  
    t1.kuendigung_zum = '0000-00-00'  
    OR t1.kuendigung_zum IS NULL  
    OR t1.kuendigung_zum > '2011-09-01'  
)  
ORDER BY name  

Nun ist folgende Tabelle hinzugekommen:
kinder_zukunft
| zid | kindid | gueltig_ab | betreuungszeit |  gruppe   | aktiviert |
|  1  |   2    | 2011-10-01 |    10          |   2       |     1     |  -- Änderung 'betreuungszeit'
|  2  |   3    | 2011-10-01 |    10          |   4       |     1     |  -- Änderung 'gruppe'
|  3  |   2    | 2011-11-01 |    6           |   2       |     1     |  -- Änderung erneut 'betreuungszeit'
|  4  |   5    | 2011-09-01 |    10          |   1       |     1     |  -- Änderung 'aktiviert'

Abfrage neu: Namen, Betreuungszeit und Adresse aller Kinder der Gruppe x  ab 01.09.2011 unter Berücksichtigung der Tabelle "kinder_zukunft" ?

Mein Lösungsansatz wäre:
Vor der eigentlichen Abfrage eine Temporäre Tabelle "kinder_temp" anzulegen und die Werte aus "kinder" mit denen von "kinder_zukunft" (welche schon von Bedeutung sind) zu verschmelzen.

Statt die Tabelle "kinder"  würde ich dann "kinder_temp" abfragen.
Allerdings habe ich bedenken von der Effizienz des Vorhabens.
Die Tabellen "kinder" und "kinder_zukunft" haben eigentlich noch mehr Spalten und es kann durchaus vorkommen das direkt hintereinander verschieden Daten abgefragt werden. Wenn dann jedes mal ein anderes Datum angegeben wird - hmm... ich weiß nicht was denkt ihr?
Oder doch Sub-Selects, aber geht das überhaupt?
Ich bin absolut kein Sql-Experte, bin immer froh wenn es irgendwie richtig und zuverlässig funktioniert.
Ach so DBMS ist MySql 5.5.

Gruß Svenchen

  1. Hallo Svenchen,

    ich bin mir nicht sicher was die beste(n) Abfrage(n?) für folgendes Problem ist.

    oh, ich bin mir aber ziemlich sicher, dass sich das niemand gerne durchliest.
    Ohne jetzt hier den ChrisB-Style zu pflegen und zu sagen, du sollst erst mal lesen, programmieren und dich dann zu artikulieren lernen, würde ich sagen, dass eine konkrete Problembeschreibung mehr als hilfreich wäre. Auf deutsch: was willst du erreichen ?
    Ach ja, bei Gelegenheit würde ich zu JOINS raten. Zudem würde ich tendieren - gerade wenn man anfängt - die verschiedenen Teile des Querys in jeweils eine neue Zeile zu schreiben (also select, dann from, dann join, etc.). Deine Abfrage von oben sähe damit viel übersichtlicher aus (ungetestet):

    SELECT CONCAT(t1.nachname,', ', t1.vorname) AS name, t1.betreuungszeit, t1.aufnahme_ab, t1.kuendigung_zum, CONCAT(t2.straße,' - ', t2.plz,' ', t2.ort) AS adresse  
    FROM kinder t1  
    JOIN eltern t2 ON t2.elternid = t1.elternid  
    WHERE t1.gruppeid = 1  AND t1.betreuungszeit > 0  AND t1.aktiviert =1  AND t1.aufnahme_ab <= '2011-09-01'  AND ( t1.kuendigung_zum = '0000-00-00'  OR t1.kuendigung_zum IS NULL  OR t1.kuendigung_zum > '2011-09-01' )  
     ORDER BY name  
    
    

    Gruß aus Berlin

    --
    Science flies you to the moon.
    Religion flies you into buildings.
    selfcode: ie:{ fl:| br:^ va:? ls:< fo:{ rl:( n4:{ ss:} de:[ js:} ch:{ sh:) mo:? zu:)