mySQL esperti, hanno bisogno di aiuto con 'intersezione'
Domanda
So che mySQL 5.x non supporta si INTERSECANO, ma che sembra essere la cosa di cui ho bisogno.
Tabella A:Prodotti (p_id)
Tabella B:Prod_cats (cat_id) - categoria di informazioni (nome, descrizione, ecc)
Tabella C:prod_2cats (p_id, cat_id) - molti a molti
prod_2cats contiene molti (1 o più) categorie che hanno ricevuto i Prodotti (A).
Facendo una query di ricerca di filtro (utente interattivo) e devono essere in grado di selezionare tra più categorie di prodotti che rispondono a TUTTI i criteri.
Ex:- 80 prodotti assegnati alla Categoria X - 50 prodotti assegnati per la Categoria Y - ma solo 10 prodotti (intersezione) sono assegnati ad ENTRAMBI i cat X E Y cat
Questo sql lavora per una di queste categorie:
SELECT * FROM prodotti WHERE p_show='Y' E p_id IN ( SELECT p_id DA prods_2cats
COME PC DOVE PC.cat_id =" .$cat_id ."
<-$cat_id è sterilizzata var passati dal modulo di query .
Io non riesco a trovare il modo di dire 'mi danno l'intersezione di Un cat e cat B' e ottenere il sottoinsieme (10 record, dal mio esempio)
Aiuto!
Soluzione
Applicare la definizione di intersezione dalla teoria degli insiemi.Quindi, se X interseca Y dà insieme Z, allora per ogni x in Z si sostiene che x X e x in Y.
Qualcosa di simile
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)
Altri suggerimenti
Hmm, io non sono sicuro che sia il modo migliore per farlo, ma può essere aggiunto al tuo già esistente query in modo abbastanza semplice:
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 ))
O, ancora meglio
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 )
Spero che questo aiuta