Hallo Forum,
ich habe eine Tabelle, die mit objekt IDs aus anderen tabellen gefüllt ist.
Also
Tabelle 1 = Gegenstand
Tabelle 2 = Merkmal
Tabelle 3 = Gegenstand_Merkmal
Ein Gegenstand kann mehrere merkmale haben.
In T3 steht dann:
obj_id, Merkmal_id
1 , 2
1 , 3
1 , 7
2 , 4
2 , 5
Ich will jetzt alle Gegenstände haben, die die merkmal IDs 2, 3 und 7 haben.
Das müsste dann die obj-id 1 sein.
Wie sieht denn jetzt die MySQL abfrage aus?
Ich bin mit meinem Latein völlig am ende.
Nicht gedacht, dass sowas triviales so schwer zu lösen ist mit MySQL
Danke für eure Hilfe im voraus.
Ankündigung
Einklappen
Keine Ankündigung bisher.
alle objekte mit bestimmten werten in einer tabelle
Einklappen
Neue Werbung 2019
Einklappen
X
-
alle objekte mit bestimmten werten in einer tabelle
Stichworte: -
-
Wie wärs damit:
Code:SELECT obj_id FROM `gegenstand_merkmal` WHERE merkmal_id IN ( 2, 3, 7 ) GROUP BY obj_id HAVING COUNT( DISTINCT merkmal_id ) = 3
Es ist defintiv performanter als einfach alles auszulesen und mit PHP zu prüfen.
Wenn die Tabelle einen UNIQUE-Index für (obj_id, merkmal_id) hat, dann kann man das DISTINCT im SQL-Audruck auch weglassen.
EDIT: Oh, da war Chris ein paar Minuten schneller als ich
-
Zitat von cyber_mc Beitrag anzeigenNicht gedacht, dass sowas triviales so schwer zu lösen ist mit MySQL
Mittels WHERE-Klausel alle Datensätze selektieren, die die gewünschte Merkmal-ID haben, nach obj_id Gruppieren, mittels COUNT die Anzahl dieser Datensätze ermitteln, und mittels HAVING nur die ins Ergebnis übernehmen, bei denen diese Anzahl 3 (bzw. anderer Wert entsprechend der Anzahl der Merkmal-IDs) ist.
Einen Kommentar schreiben:
-
Ja, wäre auch eine Möglichkeit.
Vielen Dank für Deine Hilfe.
Gruß,
cyber_mc
Einen Kommentar schreiben:
-
Ich würde einfach alle auslesen und das ganze dann in ein Array speichern dann kannste das einfach auswerten ohne die DB zu belasten
also ein array der struktur:
Gegenstand['merkmal'] = array(2,3,7)
das halt so aus der DB lesen und dann in einer schleife mit in_array abfragen
Einen Kommentar schreiben:
-
Ah, ok.
Danke!
Dann hab ich jetzt jedenfalls gewissheit, dass es so nicht funktioniert.
Da muss ich mir wohl eine andere Strategie überlegen.
Es können mehr als drei Merkmale sein.
Vielleicht währe eine Alternative die Merkmale als Spalte einer Tabelle anzulegen?
Ich denke mehr als zwanzig werden es nicht.
Einen Kommentar schreiben:
-
achso na das ist etwas komplizierter, wenn nicht unmöglich mit reinem sql, da die Anzahl der Merkmale variabel ist...
Wenns nur die drei merkmale sind musst Du eben die Tabelle T3 dreimal joinen
Einen Kommentar schreiben:
-
In der Dokumentation von MySQL wird IN als alternative zu OR beschrieben.
Irgendwie hab ich da einen Denkfehler in der Sache.
Bei der Abfrage werden auch Objekte ausgegeben, die zwar das Merkmal 2 aber NICHT 3 und 7 haben.
die Objekte müssen aber ALLE Merkmale besitzen.
Einen Kommentar schreiben:
-
lerne Grundlagen.
WHERE ausstatt_id IN(2,3,7) könnte Dir helfen, aber auch wenn Du es jetzt hinbekommst setze Dich mit der Materie mal auseinander, das ist sowas von Banal
Einen Kommentar schreiben:
-
Wie funktioniert es dann?
OR geht nicht, da zwingend alle werte vorkommen müssen....
Einen Kommentar schreiben:
-
AND ausstatt_id = '2'
AND ausstatt_id = '3'
Schliesst sich auch gegenseitig aus. Der wert kann nie gleichzeitig 2 une 3 sein
Einen Kommentar schreiben:
-
SELECT t1.obj_id FROM t1
LEFT JOIN t3
ON t1.obj_id = t3.obj_id
WHERE ausstatt_id = '2'
AND ausstatt_id = '2'
AND ausstatt_id = '3'
klappt z.B. nicht.
Einen Kommentar schreiben:
-
Hab ich auch schon versucht.
Irgendwie steh ich heute auf'm schlauch und find die Lösung nicht.
Vielleicht denk ich auch wieder zu kompliziert.....
Einen Kommentar schreiben:
Einen Kommentar schreiben: