Frage

eine Tabelle der Gegeben, eine Tabelle von Tags und eine Join-Tabelle zwischen ihnen, was für eine gute und effiziente Art und Weise ist Abfrage der Form zu implementieren:

p1 AND p2 AND ... AND pn AND NOT n1 AND NOT n2 ... AND NOT nk

Ich bin mit SQL. So alle Artikel zu finden, die alle Tags p1 ... pn und keiner von n1 entsprechen ... nk?

Gibt es eine gute "Standard" Lösung für das?

War es hilfreich?

Lösung

Schwer zu sagen, ohne Ihr Schema zu wissen, aber so etwas wie dies funktionieren würde:

select article_id from articles
inner join tag t1 on t1.article_id=articles.article_id and t1.tag='included_tag'
inner join tag t2 on t2.article_id=articles.article_id and t2.tag='another_included_tag'
left outer join tag t3 on t3.article_id=articles.article_id and t3.tag='dont_include_tag'
left outer join tag t4 on t4.article_id=articles.article_id and t4.tag='also_dont_include_tag'
where t3.tag_id is null and t4.tag_id is null

innere Verknüpfung zu Tags, die enthalten sein sollen, und tun ein Anti-Join (Outer Join + wo eine erforderliche Spalte null ist), um Tags, die nicht berücksichtigt werden sollen

Andere Tipps

Ich denke, das ist das, was Sie suchen:

SELECT * FROM TABLE_NAME WHERE COLUMN1 IN ('value1','value2','value3') AND COLUMN1 NOT IN ('value4','value5','value6')

Wenn nicht, lassen Sie mich wissen. Vielleicht habe ich Ihre Frage falsch verstanden.

Es hängt davon ab, wie Sie Tags in der Datenbank sind speichern, aber Sie wahrscheinlich die IN Betreiber wollen:

SELECT tag FROM myTags WHERE tag IN ('p1','p2',...)
SELECT tag FROM myTags WHERE tag NOT IN ('p1','p2',...)
SELECT DISTINCT itemID FROM ItemsTags it, Tags t 
WHERE it.tagID = t.ID AND t.tag IN ('p1','p2','p3') AND t.tag NOT IN ('p4','p5','p6')
SELECT i.title
  FROM items i
 WHERE EXISTS(SELECT * FROM join_table j JOIN tags t ON t.id = j.tag_id WHERE j.item_id = i.id AND t.name = 'tag1')
   AND NOT EXISTS(SELECT * FROM join_table j JOIN tags t ON t.id = j.tag_id WHERE j.item_id = i.id AND t.name = 'tag2')

SQL-Server hat eine gute Arbeit über dieses Konstrukt, aber Oracle könnte einige Hinting muß es richtig machen (zumindest 5 Jahre habe vor).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top