SELECT über mehrere tabellen - ich verzweifle



  • hallo zusammen
    ich verzweifle langsam an einem simplen SELECT statement. erstmal ein beispiel:

    SELECT * FROM table1 AS a, table2 AS b, table3 AS c, table4 AS d, table5 AS e, table6 AS f, table7 AS g WHERE a.active = '1' AND b.id = a.id1 AND c.id = a.id2 AND d.id = a.id3 AND (e.id = a.id4 OR a.id4 = 0) AND (f.id = a.id5 OR a.id5 = 0) AND (g.id = a.id6 OR a.id6 = 0)
    

    es sind insgesamt 7 tabellen, wovon table1, also mit alias "a" die haupt tabelle ist, von der ich eigentlich die resultate benötige. die tabellen haben alle eine unterschiedliche zeilen anzahl.

    table1: 2
    table2: 4
    table3: 24
    table4: 40
    table5: 5
    table6: 8
    table7: 64

    ich brauche die tabellen 2-7 nur um an text werte über id's (die in der main tabelle hinterlegt sind) zu kommen. jetzt kommt das problem:

    ich erhalte nun mit dem SELECT statement welches oben als beispiel vorliegt, einfach viel mehr ergebnisse als notwendig. sprich, es werden ca. 52 zeilen dazugehängt, obwohl es eigentlich maximal 2 sein können, da die haupt tabelle nur zwei zeilen daten enthält. und da die WHERE klausel nur aus AND operatoren besteht, verstehe ich nicht warum der mysql server mir die beiden zeilen immer wieder unten anhängt. bereits die erste bedingung (a.active = '1') kann ja eigentlich garnicht mehr wahr sein weil es keine weiteren zeilen aus der main tabelle mehr gibt zum überprüfen.

    mir ist glaube ich schon klar das mysql wegen den tabellen zeilen unterschiede irgendwie anhängen muss, aber mir ist nicht klar warum genau weil die bedingungen ja garnicht mehr erfüllt werden können und auch nicht sollen. so ergibt das ergebnis einen totalen wirr-warr salat. ich möchte erreichen das in der haupt tabelle nach werten gesucht wird. dann sollen die integer werte die dort für die anderen tabellen hinterlegt wurden, genommen werden um den text dazu aus den anderen tabellen zu holen. eine id kann immer nur eine zeile aus einer der anderen tabelle bedeuten. wenn nun aber in der haupt tabelle ein integer wert hinterlegt wurde, den es in den anderen tabellen garnicht gibt (die option dazu wurde z.B. nicht gewählt, also wert 0), dann soll die aktuelle zeile aber dennoch ins result kommen, wenn der rest stimmt. demnach dachte ich es wäre sinnvoll und logisch zu schreiben:

    AND (e.id = a.id4 [b]OR a.id4 = 0[/b])
    

    soll bedueten, wenn OR ins spiel kommt, soll garnichts aus der tabelle "e" überprüft werden und die aktuelle zeile bei der haupt tabelle soll dennoch (wenn alles andere stimmt) ins result. was mir die probleme beschafft ist eben der OR operator in diesem fall. es liefert mir dann eben das wirr-warr ergebnis und ich komme einfach nicht drauf warum. ich hoffe ihr versteht was ich meine und könnt mir licht ins dunkle bringen.



  • waaaaaaaa schrieb:

    AND (e.id = a.id4 [b]OR a.id4 = 0[/b])
    

    Damit fehlt die Diskriminate für Tabelle e. Verwende outer joins stattdessen:

    SELECT * FROM table1 AS a 
    JOIN table2 AS b ON b.id = a.id1
    JOIN table3 AS c ON c.id = a.id2
    JOIN table4 AS d ON d.id = a.id3
    JOIN table5 AS e ON e.id = a.id4
    LEFT JOIN table6 AS f ON f.id = a.id5
    LEFT JOIN table7 AS g ON g.id = a.id6
    WHERE a.active = '1'
    

    Du solltest fehlende Keys auf NULL setzen nicht auf 0.
    BTW was soll das werden? DSS / Data warehouse?



  • hallo witte und danke, ich werde das mal versuchen. das ganze läuft so, das ich in einer haupttabelle waren habe wo fixe definitionen einen integer wert anstatt ds textes selber haben. die texte liegen nun eben alle als definition in sollchen tabellen. für die darstellung hole ich mir dann eben die texte aus den definitions-tabellen über die ids. enums machten für mich da keinen sinn.

    eine andre frage noch: wenn ich alle tabellen selektiere (die zeilen angabe ist oben erwähnt) und ohne WHERE klausel dann die daten anschaue, erhalte ich 750.000 ergenisse 😮 😮 warum fügt der mysql server die zeilen so oft wieder dran?



  • es klappt nun vielen dank witte. you saved my day. :xmas1:
    wann sollte man JOINS verwenden und wann kann man bei multiple selects bleiben, was ich ja zuanfangs hatte?

    ist ein JOIN so zu verstehen, das grundsätzlich nur die haupt tabelle benutzt wird und die zeile einer anderen tabelle wird angehängt, entweder mit den werten davon oder mit NULL. so gibt es dann nie einen salat von zeilen unstimmigkeit?

    und bei einem SELECT über mehrere tabellen ohne JOIN kann es im schlimmsten fall zu einem salat kommen, weil dort alle tabellen selektiert werden, anderst als bei einem JOIN?



  • Bevor du fragst was man wo verwendet solltest du dir mal ansehen was join, inner join, outer join etc. machen.

    z.B. Nur die Datensätze aus der rechten wenn sie in der linken vorhanden sind etc.
    Wie kommst du darauf das dies ein Multiselect ist?
    Multiple selects (hab diesen Befriff noch nie gehört) sind subselects.
    Du hast lediglich eine nicht dem standard entsprechende version von JOIN verwendet.
    Funktionier IMHO nur in MYSQL. (Eben nicht Standard)


Anmelden zum Antworten