[SQL] SELECT-ergebnis filtern
-
hi,
ich habe eine datenbank in der ich notizen tags zuweise.
notes(note_id, title, etc.)
notestags(note_id, tag_id)jetzt will ich bei einer abfrage nur die note_ids bekommen, die bestimmten tag_ids zugeordnet sind (aber es sollen eben mehrere möglich sein).
z.b suche ich nach einer note_id, die in der tabe notestags sowohl der tag_id 3 als auch 12 als auch 17 zugeordnet ist.wie kann ich das machen?
mfg, cypher
btw. ich verwend sqlite3. aber das dürfte egal sein denk ich
-
ODER-Verknüpfung der Tags oder eine UND-Verknüpfung?
MfG SideWinder
-
ich hab folgendes probiert:
SELECT notes.note_id FROM notes INNER JOIN notestags ON notes.note_id = notestags.note_id WHERE notestags.tag_id = 12 AND notestags.tag_id = 5
aber des geht net, is ja eigendlich auch klar, in einem datensatz kann tag_id ja nicht zwei werte haben.
mit oder spukt er mir alle aus, die entweder der einen oder der anderen oder beiden tag_ids zugeordnet sindedit: geht es vielleicht (sql intern) für jede der tag_ids eine eigene abfrage durchzuführen und dann die schnittmenge der ergebnisse zu bilden?
-
versuch mal folgendes
SELECT notes.note_id FROM notes INNER JOIN notestags ON notes.note_id = notestags.note_id WHERE notestags.tag_id in (3,12,17)
allerdings sollte es auch reichen wenn du ODER/OR statt UND/AND verwendest
-
Linnea schrieb:
allerdings sollte es auch reichen wenn du ODER/OR statt UND/AND verwendest
Eben, WHERE/IN in dieser Form liefert dassselbe wie OR, und das will er ja nicht. Er will die note_ids, die jeweils einen notestags-Datensatz mit tag_id 3, 12 und 17 haben.
Das müsste mit einem Subselect gehen. Das kann aber nicht jedes DBMS.
SELECT notes.note_id FROM notes INNER JOIN notestags ON notes.note_id = notestags.note_id WHERE notestags.tag_id = 3 AND notes.note_id IN ( SELECT notes.note_id FROM notes INNER JOIN notestags ON notes.note_id = notestags.note_id WHERE notestags.tag_id = 12 AND notes.note_id IN ( SELECT notes.note_id FROM notes INNER JOIN notestags ON notes.note_id = notestags.note_id WHERE notestags.tag_id = 17 ) )
Die kann man natürlich noch tiefer verschachteln.
Möglicherweise geht's auch einfacher.