Question

Etant donné une table d'éléments, une table de balises et une table de jointure entre elles, c'est un moyen efficace de mettre en œuvre des requêtes de la forme suivante:

p1 ET p2 ET ... ET pn ET PAS N1 ET NON n2 ... ET NON nk

J'utilise SQL. Donc, pour trouver tous les articles qui correspondent à tous les tags p1 ... pn et aucun de n1 ... nk?

Existe-t-il un bon "standard"? solution pour cela?

Était-ce utile?

La solution

Difficile à dire sans connaître votre schéma, mais quelque chose comme cela fonctionnerait:

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

jointure interne aux balises à inclure et faire une anti-jointure (jointure externe + où une colonne obligatoire est null) aux balises à ne pas inclure

Autres conseils

Je pense que c'est ce que vous recherchez:

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

Si non, faites le moi savoir. J'ai peut-être mal compris votre question.

Cela dépend de la manière dont vous stockez les balises dans la base de données, mais vous souhaiterez probablement que l'opérateur IN :

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')

Le serveur SQL fait du bon travail à propos de cette construction, mais Oracle pourrait avoir besoin d'indices pour bien faire les choses (au moins, il y a cinq ans).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top