Komplizierte Abfrage

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Komplizierte Abfrage

    hi

    ich hab ein kleines Problem mit einer SQL Abfrage. Also es gibt mehrere Tabellen:

    basic
    id | table
    1 | basic_adults
    2 | basic_children
    3 | basic_animals

    basic_adults
    id | name
    1 | Thomas
    2 | Klara
    3 | Bernd
    4 | Mathias
    5 | Heidi

    basic_children
    id | schoolid | age | hobbys
    1 | 5 | 15 | blabla
    2 | 21 | 17 | blabla
    3 | 16 | 13 | blabla
    4 | 8 | 10 | blabla
    5 | 13 | 6 | blabla

    basic_animals
    id | type | name
    1 | Krodile | Krok
    2 | Bird | Birdie
    3 | Cat | Muschi
    4 | Dog | Wuffi
    5 | Fish | Blubbi

    ...
    basic_ ... werden im laufe der Zeit mehr, aber die drei nur als Beispiel
    ...

    house
    id | houseid | rid | Etage
    1 | 1 | 1 | 1
    2 | 1 | 2 | 1
    3 | 1 | 3 | 2
    4 | 2 | 6 | 1
    5 | 2 | 7 | 2

    relations
    id | rid | tid| pid
    1 | 1 | 1 | 3
    2 | 1 | 2 | 2
    3 | 2 | 1 | 4
    4 | 2 | 1 | 5
    5 | 3 | 1 | 1
    6| 3 | 1 | 6
    7| 3 | 2 | 4

    basic_adults: Alle Erwachsenen eingetragen
    basic_children: Alle Kinder eingetragen
    basic_animals: Alle Tiere eingetragen
    house: hier sind alle Familien eingetragen
    relations:
    rid = relation_id (verbindet mehrere Personen -> tabelle house)
    tid = tabellen_id von basic
    pid = personene_id aus basic_adults, basic_children

    Im Script ist folgendes gegeben:

    $etage_start = $_POST['start'];
    $etage_end = $_POST['end'];
    $houseid = $_POST['hid'];
    $table_1 = $_POST['table_1']; // = 1 -> basic_adults
    $table_2 = $_POST['table_2']; // = 2 -> basic_children

    Ich möchte nun folgende Daten aus der DB holen:
    Alle Kinder und Erwachsene ($table_1,$table_2) die in Houseid = 5 wohnen von Etage 1 - 3 auslesen.

    Der Aufbau ist etwas kompliziert, weil mir keine andere Idee zum DB Aufbau gekommen ist, da da noch einige andere Tabellen

    dazukommen.

    Hier mein kläglicher Versuch:


    SELECT * FROM

    house h
    LEFT JOIN relations r USING (rid)

    CASE
    WHEN r.tid = 1 THEN LEFT JOIN basic_adults d ON (r.pid = d.id)
    WHEN r.tid = 2 THEN LEFT JOIN basic_children d ON (r.pid = d.id)
    WHEN r.tid = 3 THEN LEFT JOIN basic_animals d ON (r.pid = d.id)
    END

    WHERE
    h.etage = 2

    ich mach da schon seit einigen stunden rum und das war mein letzter Versuch - der aber wie ich bemerkt habe sehr viele denkfehler beinhaltet und die CASE END ohnehin nicht funktioniert.

    Geht das mit dem DB Aufbau überhaupt die Daten mit einem Mal herauszuholen?
    Wenn nicht, wie mache ich das sinnvoll in mehreren schritten?

    bin gespannt
    danke CrazyPip

  • #2
    ok anders gefragt:

    gibt es eine Möglichkeit in der SQL Abfrage bei verschiedenen bedingungen auf verschiedene Tabellen per JOIN zu verweisen.

    also quasi:
    SELECT * FROM
    tabelle1 t1
    (if t.feld = 1) { LEFT JOIN tabelle2 t2}
    (if t.feld = 2) { LEFT JOIN tabelle3 t3}
    (if t.feld = 3) { LEFT JOIN tabelle4 t4}

    sowas in der Art - deswegen habe ihc mit CASE END versucht zu arbeiten.

    gruss
    CrazyPip

    Kommentar


    • #3
      vielleicht hilft Dir ein union...
      Beantworte nie Threads mit mehr als 15 followups...
      Real programmers confuse Halloween and Christmas because OCT 31 = DEC 25

      Kommentar


      • #4
        mit welcher mysql-version arbeitest du? ggf. wären subselects möglich.

        gruß
        peter
        Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
        Meine Seite

        Kommentar


        • #5
          Hi
          Union ist eigentlich eine gute Idee, nur das Problem ist, dass die Tabellen nicht gleich viele Columnen haben. Wenn da keine Möglichkeit besteht, das zu umgehen, dann fällt Union leider weg.

          @kropff
          lokal: 5.0.20
          Webhoster: 4.0.15

          ab 4.1 sind die subselects erst möglich. d.h lokal kann ich das damit machen... nur leider nicht im www...
          Zuletzt geändert von CrazyPip; 30.11.2006, 21:23.

          Kommentar

          Lädt...
          X