2009-09-09 4 views
5

znalezienie artykułów z żadnym z kompletem metek jest stosunkowo prosta dołączyć, i został omówiony już: Best DB (MySQL) structure: Articles which contain favored tagsSQL, aby znaleźć artykuły z całym kompletem metek

ale co jeśli ja szukam i chce znaleźć artykuły z ALL z zestawem tagów?

Do specyfiki załóżmy poniższych tabelach:

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

wpadłem na to, co myślę, że może pracować, ale to ogromny, brzydki, i trochę niejasne, więc postać nie musi być lepszy sposób :

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

(Zasadniczo, jeśli policzyć ilość odpowiednich znaczników jest wartość oczekiwana.)

Odpowiedz

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> 

To powinno wystarczyć. Nie przysiągłbym, że jest to najbardziej efektywny sposób, ale zrobi to, co chcesz, zakładając, że tag_id + article_id jest kluczem podstawowym w applied_tags. Jeśli nie jest (tzn. Możesz mieć duplikaty tagów), wszystkie zakłady są wyłączone.

+0

Dzięki, to jest o wiele bardziej eleganckie. Myślę, że mogę nieco przyspieszyć, wykonując "from" (wybierz id_artykulu z applied_tags, gdzie tag_id == ) ". I tak, faktycznie mam unikalne indeksy dla obu (tag_id, article_id) i (article_id, tag_id). – me22

Powiązane problemy