DB Abfrage

G.P.

Legendäres Mitglied
An sich ist das kein grosses Problem, aber mir faellt einfach nicht ein wie ich es moeglichst effektiv loese.

Ich habe in der Datenbank 2 Tabellen.
Tabelle1: id; user; wert1;
Tabelle2: id; id_user; value

Jetzt moechte ich alle Daten aus Tabelle1 ausgeben, bei denen Wert1 = 5 ist UND bei denen folgende Bedingung fuer Tabelle2 erfuellt ist.
id(Tabelle1) = id_user(Tabelle2) UND value = X
X kann dabei mehrere Werte annehmen und es sollen NUR die Werte aus Tabelle1 wiedergegeben werden, bei denen fuer JEDES X ein Wert in Tabelle 2 existiert.

Ich hoffe ich habe mich verstaendlich ausgedruckt
biggrin.gif

Hoffentlich kann mir da jemand weiterhelfen.

MfG
GP
 
So vielleicht?

CODE SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.id = tabelle2.id_user AND tabelle1.wert1 = '5' AND tabelle2.value = 'X'
 
duerfte nicht gehen, da in Tabelle2 nicht nur 1 entsprechender Wert sondern auch mal 20 Werte gespeichert sein koennen. Und nur wenn alle 20 gewunschten Werte in Tabelle2 uebereinstimmen, soll der Wert aus Tabelle1 ausgegeben werden.

MfG
GP
 
Mit kommt momentan nur so ein Konstrukt in den Sinn:

CODE select *
from tabelle1
where (wert1=5) and (
id in (select id_user from tabelle2 where value=x)
and id in (select id_user from tabelle2 where value=y)
and id in (select id_user from tabelle2 where value=z)
and id in (select id_user from tabelle2 where value=a)
...
)

Das geht aber nur, wenn die IN-Klausel von der DB unterstützt wird. Ausserdem ist es je nach Anzahl Records und Anzahl Kriterien nicht sehr performant. Eventuell wäre das Ganze einfacher, wenn das Tabellendesign optimiert würde.

Griessli
Irene
 
Zwei Möglichkeiten:

Tabelle1: id; user; wert1;
Tabelle2: id; id_user; value

QUOTE Select A.id
From Tabelle1 As A Inner Join Tabelle2 As B1
On A.id = B1.id_user Inner Join Tabelle2 As B2
On A.id = B2.id_user ...

Where A.wert1 = 5
And B1.value = 'a'
And B2.value = 'b'
...


Das entspricht der Lösung von @Irene, der Optimierer müßte auch beide Fälle gleichartig auflösen - und hat natürlich dieselben Probleme.

Direkte Lösung: Wenn die Kombinationen id_user/value in Tabelle2 eindeutig sind, liefert


QUOTE Select Count(*) From Tabelle2 As B
Where B.id_user = NutzerId And B.value In (X)


die Zahl der Einträge zu diesem Nutzer. Wenn die Kombinationen mehrfach auftreten können, kann man bei brauchbaren DB-Systemen


QUOTE Select Count(Distinct B.value) From Tabelle2 As B
Where B.id_user = NutzerId And B.value In (X)


verwenden. Damit


QUOTE Select A.id
From Tabelle1 As A Inner Join
(Select B.id_user, Count(B.value) As Anzahl
From Tabelle2 As B
Where B.value In (X)
Group By B.id_user) As C
On A.id = B.id_user
Where A.wert1 = 5 And B.Anzahl = 'Zahl der verschiedenen Einträge in X'


Die 'Zahl der verschiedenen Einträge in X' ist entweder statisch oder man bestimmt sie über eine Unterabfrage.

Unterabfragen sind hier natürlich notwendig.
 
Hallo,

vielen Dank fuer die Erklaerung.
Es funktioniert jetzt alles bestens.

MfG
GP
 
Zurück
Oben