Roland: Datensatz-Verknüpfung...

Moin!

Ich hoffe, mein Anliegen schneidet noch php, obwohl es primär um ein mysql-Statement für eine sql-DB in php geht.

Ich versuche zwei Tabellen miteinander zu verknüpfen mit folgendem Ziel:
Es sollen alle Datensätze aus Tabelle1 ausgegeben werden und zusätzlich abgefragt werden, ob die Datensätze auch in Tabelle2 enthalten sind.

Das für die Abfrage relevante Feld ist idnummer, heißt auch in beiden Tabellen so.

Bei meinem kläglichen select-Versuch bekomme ich aber leider nur entweder alle Daten aus Tabelle1 geliefert (und ich brauche ja noch die Unterscheidung, sprich alle Datensätze aus Tabelle2 deren idnummer(n) identisch mit denen aus Tabelle1 sind).

Hier mal mein codeschnipsel

$frage_tabelle = "SELECT * FROM (SELECT tabelle1.idnummer, tabelle1.titel FROM tabelle1) AS t1 JOIN (SELECT tabelle2.idnummer as suchnummer FROM tabelle2) AS t2 ON t1.idnummer=t2.suchnummer ORDER BY titel ASC";

Brauche ich den join überhaupt? Ist der Ansatz richtig?

Nochmal zur Erklärung:
Während das query von tabelle1 durchlaufen wird und die Datensätze ausgegeben werden möchte ich abfragen, ob der gerade ausgegebene Datensatz auch in tabelle2 vorhanden ist.
Während der Ausgabe der Datensätze zusätzlich per select in jeder Zeile die tabelle2 auf identische idnummer abzufragen ist ja wohl für die performance keine gute Lösung.

Kann mir da jemand auf die Sprünge helfen?

  1. Hallo,

    Ich hoffe, mein Anliegen schneidet noch php,

    nein, keine Spur.

    Ich versuche zwei Tabellen miteinander zu verknüpfen mit folgendem Ziel:
    Es sollen alle Datensätze aus Tabelle1 ausgegeben werden und zusätzlich abgefragt werden, ob die Datensätze auch in Tabelle2 enthalten sind.

    nur ob?
    Oder benötigst Du doch irgendwelche Informationen aus der zweiten Tabelle?

    Wie sieht es mit der Beziehung zwischen den beiden Tabellen aus? Können einem Datensatz aus Tabelle1 mehrere Datensätze aus Tabelle2 zugeordnet sein?

    $frage_tabelle = "SELECT * FROM (SELECT tabelle1.idnummer, tabelle1.titel FROM tabelle1) AS t1 JOIN (SELECT tabelle2.idnummer as suchnummer FROM tabelle2) AS t2 ON t1.idnummer=t2.suchnummer ORDER BY titel ASC";

    Brauche ich den join überhaupt? Ist der Ansatz richtig?

    Der Ansatz sieht viel zu kompliziert aus.

    Während das query von tabelle1 durchlaufen wird und die Datensätze ausgegeben werden möchte ich abfragen, ob der gerade ausgegebene Datensatz auch in tabelle2 vorhanden ist.

    Du kannst das mit einem Join lösen, Du kannst das mit einem Subquery lösen.

    Pseudocode:

    Gib mir
        idnummer,
        titel,
        sowie die Information, ob es Entsprechungen in tabelle2 gibt
    aus
        tabelle1

    a) Lösung mit einem OUTER JOIN

    SELECT DISTINCT   -- wir benötigen jeweils nur einen Datensatz  
        t1.idnummer,  
        t1.titel,  
        t2.idnummer AS suchnummer    -- falls Entsprechung vorhanden  
                                     -- ist das der gleiche Wert wie in t1.idnummer  
                                     -- falls nicht, dann der Wert NULL  
    FROM  
        tabelle1 t1  
    LEFT OUTER JOIN  
        tabelle2 t2  
    ON  
        t1.idnummer = t2.idnummer  
    ORDER BY  
        t1.titel  
    
    

    eine Lösung mit Subquery:

    SELECT  
        t1.idnummer,  
        t1.titel,  
        (SELECT                            -- gib mir  
            COUNT(t2.idnummer)             -- die Anzahl der Datensätze  
         FROM                              -- aus  
            tabelle2 t2                    -- Tabelle2  
         WHERE t1.idnummer = t2.idnummer   -- die die gleiche idnummer haben  
        ) AS anzahl                        -- und benenne die Spalte mit "anzahl"  
    FROM  
        tabelle1 t1  
    ORDER BY  
        t1.titel                           -- aufsteigend ist die Standardsortierung  
    
    

    Es gibt noch weitere Möglichkeiten, das Problem zu lösen. Es hängt auch davon ab, welchen Inhalt Du in der "Prüfspalte" haben willst.

    Freundliche Grüße

    Vinzenz

    1. Hallo Vinzenz!

      Vielen Dank erstmal für deine Lösungsvorschläge!
      Ich denke, du hast meinen Ansatz schon richtig verstanden.

      Leider bleibt das script einfach hängen, ich vermute mal, es hat mit der Datenmenge zu tun.

      In meinem Beispiel habe ich nämlich zur Vereinfachung zwei where-anweisungen unterschlagen:

      SELECT
          t1.idnummer,
          t1.titel,
          (SELECT                            -- gib mir
              COUNT(t2.idnummer)             -- die Anzahl der Datensätze
           FROM                              -- aus
              tabelle2 t2                    -- Tabelle2
           WHERE t1.idnummer = t2.idnummer AND name='test'   -- die die gleiche idnummer haben
          ) AS anzahl                        -- und benenne die Spalte mit "anzahl"
      FROM
          tabelle1 t1 WHERE liste = 'abc'
      ORDER BY
          t1.titel

      ich habs mit beiden Varianten probiert und das Ergebnis ist leider dasselbe.
      Beide, von mir ursprünglich verwendete select-Anweisungen (für Tabelle1 "Select * from tabelle1 where liste='abc' ", für Tabelle2 "select * from tabelle2 where name='test') liefern die Resultate.

      Der Bezugspunkt ist halt die idnummer, die in beiden Tabellen enthalten ist.
      Um mein Anliegen noch etwas mehr zu verdeutlichen:
      wähle alles aus tabelle1 aus, wenn die spalte "liste" = 'abc' ist und frage ab, ob der Inhalt des Feldes "idnummer" in tabelle1 dem Inhalt des Feldes "idnummer" in tabelle2 entspricht.
      All die Übereinstimmungen benenne (z.B.) als "treffernummer", die anderen lass leer (null).

      Wenn das query mit all den selektierten Datensätzen durchlaufen wird, gib mir in jeder Zeile bei der Ausgabe Auskunft darüber, ob die idnummer, der gerade durchlaufenen Datensatzzeile auch in tabelle2 enthalten ist/war.

      Sorry, ich kanns nicht besser ausdrücken/erklären!