Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

consulta mysql um-para-muitos com negação e/ou vários critérios


Eu escreveria a junção de exclusão sem subconsultas:
SELECT p.productid
FROM   products p
INNER JOIN producttags AS t ON p.productid = t.productid
LEFT OUTER JOIN producttags AS x ON p.productid = x.productid 
       AND x.tag IN ('Motorcycle', 'Green')
WHERE  p.active = 1
       AND t.tag IN ( 'Ford', 'Black', 'Skateboard' )
       AND x.productid IS NULL;

Certifique-se de ter um índice de produtos nas duas colunas (ativo, productid) nessa ordem.

Você também deve ter um índice em producttags nas duas colunas (productid, tag) nessa ordem.

Outra consulta que vou precisar fazer é algo como all (Car) ou (Skate) ou (Green AND Motorcycle) ou (Red AND Motorcycle).

Às vezes, essas condições complexas são difíceis para o otimizador do MySQL. Uma solução comum é usar UNION para combinar consultas mais simples:
SELECT p.productid
FROM   products p
INNER JOIN producttags AS t1 ON p.productid = t1.productid
WHERE  p.active = 1
   AND t1.tag IN ('Car', 'Skateboard')

UNION ALL

SELECT p.productid
FROM   products p
INNER JOIN producttags AS t1 ON p.productid = t1.productid
INNER JOIN producttags AS t2 ON p.productid = t2.productid 
WHERE  p.active = 1
   AND t1.tag IN ('Motorcycle')
   AND t2.tag IN ('Green', 'Red');

PS:Sua tabela de marcação não é uma tabela Entity-Attribute-Value.