eine ziemlich komplizierte Abfrage
-
hi,
ich habe eine TabelleCREATE TABLE `attribute` ( `id` INTEGER, `attribut` varchar(30) )
in diese habe ich jetzt z.B. folgende Zeilen eingefügt
id | attribut ---------------- 1 | schnell 1 | laut 2 | schnell 2 | spanisch 3 | laut
soooo, jetzt hätte ich gern eine Abfrage die alle Zeilen selektiert, die mit der gleichen ID die Attribute schnell und laut haben.
Sprich er müsste im Bsp. die erste und zweite Zeile selektieren (schnell hat da die ID 1 und laut hat da die ID 1).
mhhhhh, wie zum Henker macht man das????
thxia
-
Kommt davon, wenn man seine Datenbank missgebildet hat. Jetzt musst du auf teure Mengenoperatoren zurückgreifen:
SELECT besitzer_id FROM attribute WHERE attribut LIKE 'schnell' INTERSECT SELECT besitzer_id FROM attribute WHERE attribut LIKE 'laut';
MfG SideWinder
-
SideWinder schrieb:
Kommt davon, wenn man seine Datenbank missgebildet hat.
danke erstmal.
Es handelt sich im Grunde um eine db, die Attribute zu Dateien speichern soll.
Sprich es gibt eine erste Tabelle files die die ID der Dateien und verschiedene Infos enthält. Und dann habe ich eben anhand dieser ID's die Attribute wie oben beschrieben erstellt.Mi fiel persönlich keine andere Art ein, wisst ihr da was besseres?
-
Eine Datei kann mehrere Attribute haben.
Ein Attribut kann zu mehreren Dateien gehören.Eine m:n-Beziehung der Tabelle "File" und der Tabelle "Attribute" die über eine Zwischentabelle "FileAttributes ( file_id, attr_id )" aufgelöst werden sollte.
MfG SideWinder
-
ehm, ja, aber da müsste ich doch die Abfrage fast genauso machen.....
-
Ein self-join hilft hier:
select a1.id from attribute a1 join attribute a2 on a1.id = a2.id where a1.attribut = 'schnell' and a2.attribut = 'laut'
liefert alle betreffenden IDs. Willst Du wirklich die beiden Zeilen, dann geht das z. B. so:
select * from attribute where id in ( select a1.id from attribute a1 join attribute a2 on a1.id = a2.id where a1.attribut = 'schnell' and a2.attribut = 'laut')
Alternativ, aber wahrscheinlich langsamer, geht auch
select a1.* from attribute a1 join attribute a2 on a1.id = a2.id where a1.attribut = 'schnell' and a2.attribut = 'laut' or a2.attribut = 'schnell' and a1.attribut = 'laut'
-
entschuldige bitte, dass ich mich solange nicht gemeldet hatte; ich war in Dresden auf einer Uni-Führung
Ich danke dir vielmals, für den Tipp und die Technik funktioniert perfekt