Datensatz-Verknüpfung...
Roland
- php
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?
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
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!