MySQL запрос кросс-тегов - PullRequest
       6

MySQL запрос кросс-тегов

1 голос
/ 21 февраля 2011

У меня есть две таблицы: одна с Элементами и одна с тегами. Я хочу найти каждый элемент в таблице элементов с тегом «foo», но без панели тегов, поэтому, если я собираюсь выбрать все элементы с тегом » foo "мой запрос будет

 SELECT * FROM items i INNER JOIN tags t on i.id= t.id WHERE tag= "foo"

и я получаю все элементы с тегами "foo", так как мне выполнить подзапрос, чтобы убрать все элементы, также помеченные как "bar"

EDIT основанный на решении Мэтью Кокса, предоставленном ниже, я придумываю это, если кто-то видит недостаток с этим, пожалуйста, сообщите мне

      SELECT * FROM items i INNER JOIN 
        tags t ON t.item_id=i.id 
        WHERE tag = 'foo' 
        AND NOT EXISTS (
            SELECT * FROM tags tt WHERE t.item_id = tt.item_id AND tag = 'bar'
        )

Ответы [ 2 ]

1 голос
/ 21 февраля 2011
SELECT *
FROM items i

INNER JOIN tags t
ON i.id = t.id

WHERE t.tag = "foo" AND NOT EXISTS (
    SELECT *
    FROM items ii

    INNER JOIN tags tt
    ON ii.id = tt.id 

    WHERE tt.tag = "bar" AND tt.id = t.id)
0 голосов
/ 21 февраля 2011
select
    *
from
    items i
where
    exists (select * from tags t where t.id = i.id and t.tag = "foo")
and
    not exists (select * from tags t where t.id = i.id and t.tag = "bar")

или

;with ItemTagCount as (
    select
        t.id,
        sum(case t.tag when "foo" then 1 else 0 end) as FooCount,
        sum(case t.tag when "bar" then 1 else 0 end) as BarCount
    from
        tags t
    group by
        t.id
)
select
    i.*
from
    items i
inner join
    ItemTagCount itc on itc.id = i.id
where
    itc.FooCount >= 1 and itc.BarCount = 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...