2010-07-05 17 views
0

J'ai un problème commun pour être sûr. Je voudrais faire une requête qui trouve une entité qui a des balises "n". Donc dans le cas le plus simple, on retrouve toutes les entités qui ont le tag "hey". Dans un cas plus complexe, on retrouve toutes les entités qui ont toutes les balises "hey", "hi" et "howdy".Comment coder efficacement une requête dans mysql à AND tags?

Il semble que je doive me joindre à la table des variables 3 fois, et ainsi créer 3 alias différents. Dans le cas abstrait, je devrai faire N alias différents. Existe-t-il un moyen plus simple d'y parvenir?

La raison pour laquelle je demande est que j'ai besoin d'écrire une requête qui non seulement le fait pour les balises, mais pour une variété de choses. Donc, je vais essentiellement rejoindre les alias NxM ... ce qui va sucer pour écrire (et régler) la requête.

Aide?

ÉDIT:

Nevermind. J'ai trouvé la solution:

select distinct g.id, g.description 
FROM gallery g 
inner join gallery_to_tag g2t_0 
    on g2t_0.gallery_id = g.id 
inner join tag t_0 
    on t_0.id = g2t_0.tag_id and t_0.term = 'hi' 

inner join gallery_to_tag g2t_1 
    on g2t_1.gallery_id = g.id 
inner join tag t_1 
    on t_1.id = g2t_1.tag_id and t_1.term = 'hey' 
+1

S'il vous plaît poster une partie de votre schéma. –

Répondre

0

Est-ce que c'est ce que vous cherchez? Il est difficile de dire sans en voir le schéma

CREATE TEMPORARY TABLE `checktags` (
    `checkme` varchar(100) NOT NULL, 
    KEY `checkme` (`checkme`) 
) ENGINE=MyISAM; 

//INSERT ALL TAGS TO CHECK 

SELECT * FROM `table` 
LEFT JOIN `tags` ON `table_id` = `tag_table_id` 
WHERE `tag` IN (SELECT `checkme` FROM `checktags`); 
0

Il est difficile de fournir une réponse précise sans le schéma, cependant, je crois que vous demandez comment déterminer si un élément donné a tous les balises requêtée . Vous pourriez faire quelque chose comme

Select .. 
From MainTable 
Where Exists (
       Select 1 
       From TagsTable 
       Where TagsTable.FK = MainTable.PK 
        And TagsTable.Tag In('hey','hi','howdy') 
       Having Count(*) = 3 
       ) 
0

Si vous voulez éviter de joindre des tables, vous aurez besoin de quelques sous-requêtes. Donc, pour N tags, vous auriez besoin de N sous-requêtes.

SELECT * FROM Entities 
WHERE id IN (SELECT entity_id FROM tags WHERE tag = 'Hey') 
AND id IN (SELECT entity_id FROM tags WHERE tag = 'Hello') 
AND ... 

Et de la même façon, vous pouvez sélectionner des entités qui sont dotés de certaines balises souhaitées:

SELECT * FROM Entities 
WHERE id IN (SELECT entity_id FROM tags WHERE tag = 'Hey') 
OR id IN (SELECT entity_id FROM tags WHERE tag = 'Hello') 
OR ...