MySQL Select Problem

Moritz K

Angesehenes Mitglied
Hallo!

Ich komme gerade nach Xh programmieren nicht weiter. Die Lösung müsste eigentlich total einfach sein.

Tabelle XYZ:

zwei Spalten (beide Fremdschlüssel):
Beispielwerte:
A-B
10-1
10-2
30-4
20-3
20-2
20-1

Jetzt will ich folgenden Select machen:
gib mir alle Fremdschlüssel A, die eine Verknüpfung in B zu 1 und(!) 2 haben. Also soll der mir 10 und 20 zurückgeben. Das muss doch total einfach sein. Aber ich raffe es gerade nicht. :p

Moritz.
 
SELECT A FROM tabelle WHERE B IN (1,2) GROUP BY A

oder habe ich was falsch verstanden?
 
Danke für die Antwort.

Aber mein "Problem" (so schwer kann es ja nicht sein) ist , dass ich die Werte von A haben will, bei denen 1 und(!) 2 in B ist. Mit IN gibt der mir auch Werte aus, die nur eine 1, aber keine 2 in B haben.
 
Vielleicht schaffst dus mit einem Subselect
CODE
SELECT * FROM XYZ AS M WHERE (1 IN ( SELECT B FROM XYZ AS WHERE M.A = A)) AND (2 IN ( SELECT B FROM XYZ AS WHERE M.A = A ) ) GROUP BY A


(Wird so nicht funktionieren, musst halt selber formulieren)

Wenn es dir zu komplex wird, lös es doch einfach Applikatorisch (Mit PHP o.Ä). Es ist Performance-Mässig nicht unbedingt schlechter als mit Subselects, etvl. sogar schneller.
 
ah OK, dann ist ein Subselect hilfreich, oder ein JOIN auf sich selbst mit ON A = A AND (B = 1 OR B = 2)
 
CODE SELECT A,COUNT(A) AS amount FROM `tabelle` WHERE B=1 OR B=2 GROUP BY A HAVING amount=2

 
QUOTE
SELECT A,COUNT(A) AS amount FROM `tabelle` WHERE B=1 OR B=2 GROUP BY A HAVING amount=2


Das wird nur funktionieren wenn A und B zusammen auf Unique sind. Weil sonst auch Datensätze kommen, welche zwei Schlüssel auf 1 haben, bzw. welche zwei Schlüssel auf 2 haben.

Falls die auf Unique, dann Performance-Mässig 100mal besser als Subselects.
 
QUOTE (bendecho @ Mo 21.8.2006, 18:39)ah OK, dann ist ein Subselect hilfreich, oder ein JOIN auf sich selbst mit ON A = A AND (B = 1 OR B = 2)

Das ist zur Hälfte richtig - das Problem ist, daß viel zu viele Zeilen produziert werden. Ein späteres Distinct würde diese zwar reduzieren, ist dann aber doppelt gemoppelt.

Man kann das sofort scharf definieren:


CODE Select Distinct X.A
From XYZ As X Inner Join XYZ As Y
On X.A = Y.A
Where X.B = 1 And Y.B = 2


Das wählt nur die möglicherweise passenden Zeilen aus und bildet über diese verkleinerte Menge einen Join.


QUOTE Wenn es dir zu komplex wird, lös es doch einfach Applikatorisch (Mit PHP o.Ä). Es ist Performance-Mässig nicht unbedingt schlechter als mit Subselects, etvl. sogar schneller.


Das ist eigentlich immer falsch, da jedes aktive Datenbank-System immer schneller ist als eine Handprogrammierung, die zusätzlich die Daten ständig aus dem Datenbankserver nach PHP herausholt. Gerade für alle Sortier-, Filter- und Gruppierungsoperationen sind ja DB-Systeme zuständig und können Indices nutzen, die außerhalb fehlen.
 
Zurück
Oben