2009-09-09 5 views
5

encontrar artículos con cualquiera de un conjunto de etiquetas es relativamente una combinación sencilla, y ya ha sido discutido: Best DB (MySQL) structure: Articles which contain favored tagsSQL para encontrar artículos con LLA de un conjunto de etiquetas

Pero lo que si que estoy buscando, y quieren para encontrar artículos con TODO un conjunto de etiquetas?

Para especificidad, asumirá las siguientes tablas:

CREATE TABLE `articles` (
    `id` INT NOT NULL 
); 

CREATE TABLE `applied_tags` (
    `tag_id` INT NOT NULL, 
    `article_id` INT NOT NULL 
); 

CREATE TABLE `search_tags` (
    `search_id` INT NOT NULL, 
    `tag_id` TAG NOT NULL 
); 

me ocurrió esto, que creo que podría funcionar, pero es enorme, feo y poco clara, por lo que figura que debe haber una manera mejor :

Select articles.id from articles 
where 
(select count(*) from applied_tags 
    where applied_tags.article_id == articles.id 
    and applied_tags.tag_id in (select search_tags.tag_id from search_tags where search_tags.search_id == <input>) 
    == 
(select count(*) from search_tags where search_tags.search_id == <input>) 

(Esencialmente, cuentan si el número de etiquetas relevantes es el valor esperado.)

Respuesta

7
select article_id 
from applied_tags 
where tag_id in (<input tag set here>) 
group by article_id 
having count(*) = <count of input tags> 

Esto debería hacerlo. No juraré que es la forma más eficiente, pero hará lo que usted quiera, suponiendo que tag_id + article_id es la clave principal en applied_tags. Si no es así (es decir, puede tener etiquetas duplicadas), todas las apuestas están desactivadas.

+0

Gracias, eso es mucho más elegante. Creo que puedo acelerarlo un poco al hacer "de (seleccione article_id from applied_tags where tag_id == )" también. Y sí, en realidad tengo índices únicos para ambos (tag_id, article_id) y (article_id, tag_id). – me22

Cuestiones relacionadas