[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 sind

    edit: 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.


Anmelden zum Antworten