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!

Foi útil?

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

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