Especialistas MySQL - Precisa de ajuda com 'Intersect'
Pergunta
Sei que o MySQL 5.x não suporta se cruzar, mas isso parece ser o que eu preciso.
Tabela A: Produtos (P_ID)
Tabela B: Prod_cats (cat_id) - Informações da categoria (nome, descrição, etc)
Tabela C: Prod_2cats (p_id, cat_id) - muitos para muitos
Prod_2cats possui as muitas (1 ou mais) categorias que foram atribuídas aos produtos (a).
Fazendo uma pesquisa de consulta/filtro, (interativo do usuário) e precisa ser capaz de selecionar em várias categorias os produtos que atendem a todos os critérios.
Ex: - 80 produtos atribuídos à categoria X - 50 produtos atribuídos à categoria y - mas apenas 10 produtos (intersect) são atribuídos a Cat X e Cat Y
Este SQL funciona para uma categoria:
Selecione * de produtos onde p_show = 'y' e p_id em (selecione p_id de prods_2cats
Como pc onde pc.cat_id = ". $ Cat_id."
<-$ CAT_ID é higienizado Var aprovado do formulário de consulta.
Não consigo encontrar os meios para dizer 'me dê o intersect de gato a e gato b' e recupere o subconjunto (10 registros, do meu exemplo)
Ajuda!
Solução
Aplique a definição de interseção da teoria dos conjuntos. Portanto, se X se cruzar, o Set Z, então para cada x em z, ele sustenta que x está em x e x está em y.
Algo como
SELECT * FROM products WHERE p_show='Y' AND p_id IN
( SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =X) AND p_id IN
( SELECT p_id FROM prods_2cats AS PC WHERE PC.cat_id =Y)
Outras dicas
Hmm, não tenho certeza se é a melhor maneira de fazê-lo, mas pode ser adicionado à sua consulta já existente com bastante facilidade:
SELECT *
FROM products
WHERE p_show='Y'
AND p_id IN (SELECT p_id
FROM prods_2cats AS PC
WHERE PC.cat_id = $cat1_id)
AND p_id IN (SELECT p_id
FROM prods_2cats AS PC2
WHERE PC2.cat_id = $cat2_id)
SELECT *
FROM products
WHERE p_show='Y'
AND p_id IN (SELECT p_id
FROM prods_2cats AS PC
WHERE PC.cat_id in ($cat1_id, $cat2_id ))
Ou ainda melhor
SELECT p.*
FROM products p INNER JOIN prods_2cats AS PC on p.p_id = PC.p_id
WHERE p_show='Y' and C.cat_id in ($cat1_id, $cat2_id )
Espero que isto ajude