MySql : Einträge mit identischen Eigenschaften finden

Status
Dieses Thema wurde gelöst! Zur Lösung gehen…

guenter024

Erfahrenes Mitglied
Hallo liebe Tutorials-Gemeinde.
ich sitze irgendwie gerade auf der Leitung.

Ich habe bspw. eine Tabelle test mit folgenden Daten
Code:
id      eigenschaft  bezeichnung
1       blau          abc
2       grün          def
3       32            abc
4       blau          ghi
5       blau          jkl
6       32            mno
7       32            jkl

Nun möchte ich bspw. alle bezeichnungen finden, die nur die eigenschaft 'blau' und 32 haben.
Das Ergebnis sollte also abc und jkl sein.

Geht das nur über einen INNER JOIN über die selbe Tabelle test?
SQL:
SELECT bezeichnung FROM test WHERE eigenschaft='32' OR eigenschaft='blau' GROUP BY bezeichnung
Bringt logischerweise auch noch ghi und mno
SQL:
SELECT bezeichnung FROM test WHERE eigenschaft='32' AND eigenschaft='blau' GROUP BY bezeichnung
Bringt Result 0.

Code:
SELECT test.bezeichnung
FROM test
INNER JOIN (SELECT bezeichnung FROM test WHERE eigenschaft='32') as join1 ON join1.bezeichnung = test.bezeichnung
INNER JOIN (SELECT bezeichnung FROM test WHERE eigenschaft='blau') as join2 ON join2.bezeichnung = test.bezeichnung
GROUP BY bezeichnung
Nur mit dem INNER JOIN komme ich auf das Ergebnis, nur das gefällt mir nicht so gut.
Gibt es da nicht noch einen einfacheren Weg?

LG
 

melmager

Erfahrenes Mitglied
SELECT bezeichnung,count(bezeichnung) as cnt FROM test WHERE eigenschaft='32' OR eigenschaft='blau' GROUP BY bezeichnung where cnt > 1

UNTESTED

listet aber auch auf wenn zwei mal blau oder zweimal 32 bei gleicher bezeichnung vorhanden ist
 

Yaslaw

n/a
Moderator
Sicher, dass 32 und blau geprüft wird.
Ungetestet
SQL:
SELECT t.bezeichnung
FROM (
        SELECT DISTINCT bezeichnung 
        FROM test 
        WHERE eigenschaft='32' 
        UNION SELECT DISTINCT bezeichnung 
        FROM test 
        WHERE eigenschaft='blau' 
    ) t
GROUP BY t.bezeichnung
HAVING COUNT(t.*) = 2;
 

guenter024

Erfahrenes Mitglied
Hallo,
vielen Dank für den Input. :)
Die Ideen sind gut, aber es haut so auch nicht hin.

Vermutlich ist es auch die Beste Lösung, denn es könnte ja auch sein, das ein weiteres Mal nach eigenschaft IN (32,33) gesucht wird, also bspw.
SQL:
INNER JOIN (SELECT bezeichnung FROM test WHERE eigenschaft IN ('32', '33') ) as join1 ON join1.bezeichnung = test.bezeichnung
INNER JOIN (SELECT bezeichnung FROM test WHERE eigenschaft='blau') as join2 ON join2.bezeichnung = test.bezeichnung

Außerdem können noch weitere Eigenschaften hinzukommen, und es soll eventuell auch nur nach bestimmten bezeichnungen gesucht werden.

SQL:
SELECT test.bezeichnung
FROM test
INNER JOIN (SELECT bezeichnung FROM test WHERE eigenschaft IN ('32','33') ) as join1 ON join1.bezeichnung = test.bezeichnung
INNER JOIN (SELECT bezeichnung FROM test WHERE eigenschaft='blau') as join2 ON join2.bezeichnung = test.bezeichnung
WHERE test.bezeichnung = 'abc'
GROUP BY test.bezeichnung

So würde die Abfrage nur noch 'abc' liefern.

Wenn keine anderen Ideen kommen werde ich wohl bei den INNER JOIN - Verküpfungen bleiben, bis mir was anderes einfällt...

LG

PS: In der Original-Tabelle stehen natürlich nicht die echten Eigenschaften und Bezeichnungen sondern deren id's, das Beispiel war zum Testen gedacht. Der Gesamtumfang ist tatsächlich natürlich viel größer :)
 
Zuletzt bearbeitet:

Zvoni

Erfahrenes Mitglied
Dein SQL abgewandelt (gestestet in SQLite - beachte den anderen Tabellennamen):
Es gibt keinen Grund separate Sub-Selects zu machen, aber im Prinzip ist mir auch nichts besseres als die INNER JOIN's eingefallen
SQL:
SELECT T1.Bezeichnung FROM tbl_temp T1

INNER JOIN tbl_temp T2
    ON
    T2.Eigenschaft='32' AND
    T2.Bezeichnung=T1.Bezeichnung
INNER JOIN tbl_temp T3
    ON
    T3.Eigenschaft='blau' AND
    T3.Bezeichnung=T1.Bezeichnung

GROUP BY T1.Bezeichnung
 
Zuletzt bearbeitet:

Yaslaw

n/a
Moderator
Zvonis Variante ist unschön. Feld=Wert gehört in ein WHERE, nicht in ein ON.
Zudem kann man mit Subqueries das ganze auf ein INNER JOIN reduzieren. Müsste auch Performanter sein.
Es gibt also so viele Möglichkeiten dieses Problem zu lösen
SQL:
SELECT DISTINCT t1.bezeichnung 
FROM 
    (
        SELECT bezeichnung
        FROM tbl_temp
        WHERE eigenschaft='32'
    ) t1 INNER JOIN (
        SELECT bezeichnung
        FROM tbl_temp
        WHERE eigenschaft='blau'
    ) t2
    ON t1.bezeichnung=t2.bezeichnung
 

Zvoni

Erfahrenes Mitglied
Yaslaw hat natürlich recht das EinFeld=EinWert in ein WHERE gehört, aber auf der anderen Seite kann man auch argumentieren, dass ein ON das WHERE eines JOIN's ist *schulterzuck*
Generell versuche ich Sub-Selects zu vermeiden, da man unter Umständen von aussen auf Felder zugreifen will, welche dann explizit im SELECT mit angegeben werden müssen, and da wirds mal schnell unübersichtlich.
Zu Performance kann ich nix sagen, da ich keine statistisch relevante Datenmenge zur Verfügung habe.

Was ich auch nicht weiss (da ich es noch nie nutzen musste): Kann ich in einem ON auch Parameter nutzen?
In einem WHERE weiss ich es, aber in einem ON?
 

guenter024

Erfahrenes Mitglied
Huhu,
das sieht auch super aus.
Eine Frage hätte ich noch.
Wie gesagt kann es ja sein, dass noch weitere Eigenschaften auftauchen, die abgefragt werden müssen.
Da benötige ich dann aber ja doch wieder mehrere INNER JOIN - Abfragen, oder?
 
Status
Dieses Thema wurde gelöst! Zur Lösung gehen…