Pergunta

Eu preciso de uma consulta SQL que irá recuperar todos os itens que possuem ambas as marcas, não qualquer uma das tags. Eu já tenho uma consulta, mas retorna todos os itens que Hove ambas as marcas, não se espera resultado. Encontrar descrição detalhada abaixo. Obrigado!

Estrutura da tabela:

ITEMS TABLE
------------
item_id
item_name

TAGS TABLE
----------
tag_id
tag_name

ITEMTAGS TABLE
---------------
tag_id
item_id

Inquérito:

SELECT Items.* FROM Items 
INNER JOIN ItemTags ON Items.item_id = ItemTags.item_id
WHERE ItemTags.tag_id IN (T1, T2)
GROUP BY Items.item_id

Resultado: Todos os itens que têm T1 ou T2

Resultado esperado: Todos os itens que têm tanto T1 e T2

Foi útil?

Solução

select i.*
from items i, itemtags it1, itemtags it2
where i.item_id=it1.item_id and it1.tag_id=T1
and i.item_id=it2.item_id and it2.tag_id=T2;

Outras dicas

Se o seu banco de dados suporta a palavra-chave se cruzam (SqlServer não) você pode escrever:

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
/* intersection between items that have the tag T1 
   and the ones that have the tag T2 */ 
(
    SELECT item_id FROM ItemTags WHERE tag_id = T1
    INTERSECT 
    SELECT item_id FROM ItemTags WHERE tag_id = T2
)

Se não, você vai precisar fazer algo como:

SELECT Items.* 
FROM Items 
WHERE Items.item_id in 
(
    SELECT ItemTags1.item_id 
    FROM ItemTags as ItemTags1 
        INNER JOIN ItemTags as ItemTags2 
        ON ItemTags1.item_id = ItemTags2.item_id 
    WHERE 
            ItemTags1.tag_id = T1
        AND ItemTags2.tag_id = T2
)

Na segunda consulta cuidar de possíveis problemas por causa da ItemTags1.item_id = ItemTags2.item_id desempenho. Você vai precisar de um índice na chave externa para funcionar bem.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top