J'utilise Postgresql. J'ai une table d'éléments, une table d'étiquettes, et une table qui lie beaucoup de balises à un article. Je dois sélectionner les éléments correspondant à 2 (ou plus) balises données.Sélection de l'endroit où plusieurs valeurs d'une table jointe correspondent à un ensemble donné
Je peux sélectionner des éléments qui correspondent à 1 ou plus avec WHERE tag.name IN ('tag1', 'tag2')
En MySQL je pense que j'aurais pu dire WHERE x IN ALL (y, z)
, mais ça ne marche pas, c'est du pgsql. Jusqu'à présent, le mieux est de joindre les deux tables deux fois en utilisant une sous-requête. Évidemment, cela ne correspondra pas à l'appariement de nombreuses étiquettes et je suis certain que ce n'est pas l'approche la plus efficace.
SELECT *
FROM item
JOIN (SELECT item.id FROM item
JOIN tagged on tagged.item=item.id
JOIN tag ON tag.id=taged.tag
WHERE tag.name='tagOne') p ON p.id=item.id
JOIN tagged ON tagged.item=item.id
JOIN tag ON tag.id=tagged.tag
WHERE tag.name='tagTwo'`
Edit: Je teste encore les choses, mais en utilisant cela dans une sous-requête fonctionne mieux que ma ci-dessus tentative
SELECT item.id, count(tag2) AS relevance
FROM item
JOIN tagged tagged1 ON tagged1.item=item.id
JOIN tag tag1 ON (tag1.id=tagged1.tag AND tag1.name='tag1')
JOIN tagged tagged2 ON tagged2.item=item.id
JOIN tag tag2 ON (tag2.id=tagged2.tag)
WHERE tag2.name IN ('tag2', 'tag3')
GROUP BY item.id
Comme l'a demandé voici quelques définitions de table de clarification:
CREATE TABLE item (id serial, [...]);
CREATE TABLE tag (id serial, name string UNIQUE);
CREATE TABLE taged (tag int references tag(id), item int references item(id));
Voir http://stackoverflow.com/questions/2161588/what-mysql-query-should-i-use-to-select-a-category-that-matches-all-my-criteria –
Je ne sais pas pense 'WHERE x IN ALL (y, z)' fait ce que vous pensez dans MySQL. Pouvez-vous fournir un exemple MySQL afin que nous puissions voir exactement ce que vous pensez? –
cela permettrait d'améliorer la question si vous ajoutez des définitions de table car le nom de la table/colonne est un peu déroutant –