MySql : Beste Lösung für Abfrage über mehrere Tabellen
Svenchen
- datenbank
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
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