2010-03-05 8 views
2

J'ai 3 tables pour les étiquettes, les catégories d'étiquettes et les étiquettes utilisées. Je veux obtenir une liste de toutes les balises avec un compte des balises utilisées (le format des balises utilisées est des valeurs séparées par des virgules pour chaque identifiant de document qui a des balises).en ajoutant la valeur d'une colonne dans une instruction LIKE?

J'ai essayé quelque chose comme ceci mais je ne peux pas obtenir la valeur du champ tags.tag à insérer dans l'instruction LIKE.

SELECT categories.category, tags.tag,
(SELECT COUNT(id) FROM usedtags WHERE usedtags.value LIKE '%tags.tag%') as numtags
FROM tags
LEFT JOIN categories ON categories.id = tags.category_id
ORDER BY categories.category, tags.tag

Il doit y avoir une meilleure façon de le faire, mais mon SQL est pas assez bon !!

Est-ce que quelqu'un peut me diriger dans la bonne direction?

Un grand merci

Répondre

2

Quelque chose comme ça, peut-être:

OÙ [colonne] comme [OtherColumn] + '%'

Je veux aussi souligner un problème majeur de performance dans votre plan actuel. Vous essayez d'utiliser un joker initial dans votre recherche, comme ceci: LIKE '%tags.tag%'. C'est très mauvais, parce que ça ne marche pas avec vos index. Nous dirions que ce n'est pas sargable. Chaque fois que vous vous trouvez vouloir utiliser une première carte générique comme ça, vous devriez regarder un full-text index à la place. Ce n'est pas si difficile et améliorera considérablement les performances de votre base de données.

+0

salut joel merci pour le pointeur. Pour l'instant, je ne suis pas trop préoccupé par le problème du texte intégral, car il n'y a pas beaucoup de lignes. Cependant, votre suggestion ne fonctionne pas, en jetant la même erreur mysql que je devais avant ?? – David

1

peut-être quelque chose comme ceci:

SELECT c.Category, t.tags, count(u.id)
FROM Tags T
Left Join Categories c on c.id = t.category_id
Inner Join UsedTags u on u.value like '%' & t.tag & '%'

le & peut devoir être remplacé par votre base de données spécifique (par exemple dans T-SQL, il est le double pipe ||)

+0

Salut leslie, ça sonne bien aussi mais il n'aime pas la partie '%' & t.tag & '%' (j'utilise mysql 5.0.27) – David

+0

cela vous donne-t-il un message d'erreur ou juste une syntaxe invalide? – Leslie

+0

donc il semble que le concaténateur mySQL peut être le ||, donc je remplacerais le% par ||. Ou j'ai également trouvé cette syntaxe qui peut fonctionner pour vous: comme ConCAT ('%', t.tag, '%') – Leslie

Questions connexes