Frage von Geheim0815, 63

SQL Abfrage 1:n mit und verknüpfung auf der n Seite?

Kann jemand helfen?

Ich habe folgende Ausgangssituation:

tabelle 1:

datei_id datei_name datei_status

tabelle 2:

datei_id datei_tag

tabelle 2 ist die n tabelle. Was ich jetzt suche ist eine Abfrage die mir alle Datensätze von tabelle 1 gibt bei denen bestimmte Tags aus tabelle 2 (über datei_id verknüpft) vorhanden sind. Die Anzahl der und Verknüpfungen in tabelle 2 ist vorher nicht bekannt. Man könnte jetzt php seitig via selfjoins etwas zusammen bauen, ich suche aber einen sql Ansatz.

Antwort
von Alextoexplain, 21

Hi there,

einen Join sollte man, wenn möglich, aus Performancegründen vermeiden, da bei einem Join der Regel immer eine Bereinigung des Kreuzprodukts stattfinden muss, die Zeit kostet.

Für deine Idee ist ein Subquery das Richtige:

SELECT * FROM tabelle1
WHERE datei_id IN
(
     SELECT DISTICNT datei_id
     FROM tabelle2
     WHERE datei_tag = "-->Gesuchter Wert<--"
);

Das sollte es sein:
MfG

Alex

Kommentar von Geheim0815 ,

funktioniert so leider auch nicht, das geht wenn man nur einen wert in der subquery sucht, oder bei einer oder verknüpfung, aber nicht mehr wenn man sagt

SELECT DISTICNT datei_id 
     FROM tabelle2
     WHERE datei_tag = "wert1" and datei_tag="wert2" and datei_tag="wert3"
Kommentar von Alextoexplain ,

Hello there,

doch das geht, weil ich ja sage WHERE datei_id IN() das heißt ich erlaube mehrere.
Was natürlich nicht geht ist, dass du das ganze mit AND verknüpfst, weil ein Feld kann ja nicht zwei unterschiedliche Werte gleichzeitig haben, das gibt klar nichts zurück.

Wenn du bereits im Subquery mehrere Sachen im WHERE haben willst, musst du entweder mit OR statt mit AND verknüpfen oder du verwendest wieder ein IN() und ne kommagetrennte Auflistung.

Antwort
von fluffiknuffi, 40

Äh... dann halt JOIN(s) per SQL, nicht per PHP?! [Was ein selfjoin in PHP ist, ist mir übrigens nicht klar]

Kommentar von Geheim0815 ,

mit self join meine ich es so

SELECT * from datei_tags dt1 inner join datei_tags dt2 on dt1.datei_id=dt2.datei_id where (dt1.datei_id='1' and dt1.datei_tag='x') and (dt2.datei_id='1' and dt2.datei_tag='y')

gibt mir datei_id aus wenn es 2 reihen gibt. Das ganze geht noch bei 2 und verknüpfungen, wenn es mehr werden wird die Abfrage aber immer länger. Ich könnte sie mir php seitig so zusammen bauen, suche aber eine komfortablere Lösung.

Antwort
von happyfish2, 24

SELECT d.* FROM tab1 AS d INNER JOIN tab2 as t USING (datei_id) WHERE t.tag = 'meintag'

Antwort
von yerooke, 27

Keine AHnung ob ich das richtig verstanden habe:

SELECT * FROM tabelle1
INNER JOIN tabelle2
ON tabelle1.datei_id = tabelle2.datei_id
WHERE
tabelle2.datei_tag = 'x'

Kommentar von Geheim0815 ,

so funktioniert das wenn man in tabelle2 nur ein Feld abfragt, aber um das beispiel zu erweitern "where tabelle2.datei_tag = 'x' and tabelle2.datei_tag = 'y'. So funktioniert es aber leider nicht.

in tabelle2 gibt es

datei_id    tag

1               x
1               y

die Abfrage soll also nur dateien anzeigen die sowohl die Eigenschaft X, als auch die Eigenschaft Y (oder aber auch X+Y+Z) haben

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten