2011-08-17 11 views
6

chiunque potrebbe aiutarmi a creare una query basata sulla query seguente.Query MySQL - più clausola WHERE su 1 colonna

Come si può vedere, ho un prodotto con specifiche e determinati gruppi che si accumulano nel front-end. Conosco il problema, 1 colonna non può essere 2 valori contemporaneamente ma ho bisogno solo di quei prodotti che sono in quei 2 gruppi.

Per illustrare, product_specification_sid, id 2 3 e 4 sono formati e de resto 8 ~ 11 sono i colori, quindi vorrei scegliere un prodotto che ha 2 e 3.

interno unendo la tabella doppia isn' t un'opzione in quanto i gruppi (dimensioni, colori) possono variare in futuro.

SELECT 
    products.*, 
    categories.*, 
    manufacturers.* 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ON product_specification_pid=product_id 
WHERE 
    product_active = 1 
AND 
(
    product_specification_sid in (3) 
AND 
    product_specification_sid in (8,9,6,7,10,11) 
) 
GROUP BY product_id 
+1

Ho postato una risposta che ha fatto il join interno due volte. Ma poi ho letto la tua dichiarazione che diceva che ci hai già pensato. Non capisco perché dici che non è un'opzione? – Eljakim

risposta

5

È possibile utilizzare una clausola di avere invece.

SELECT 
    products.*, 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ON product_specification_pid=product_id 
WHERE product_active = 1 
GROUP BY product_id 
HAVING COUNT(CASE WHEN product_specification_sid in (3) THEN 1 END) > 0 
AND COUNT(CASE WHEN product_specification_sid in (8,9,6,7,10,11) THEN 1 END) > 0 
+2

Se quelle che hanno condizioni sono '> 1'? Penserei '> = 1' /'> 0', o '= 1'. –

+1

La query non ha funzionato all'inizio ma @Sam DeHaan l'ha risolto! Ho sostituito il> 1 bij> = 1 e funziona come un incantesimo! – PvdL

+0

Ho cambiato la query ora. –

1

Da quanto ho capito, siete alla ricerca di un record prodotto che ha due record corrispondenti product_specification che soddisfano determinate condizioni. Mi sembra la soluzione semplice è:

SELECT products.*, categories.*, manufacturers.* 
FROM products 
INNER JOIN product_categories ON product_category_pid = product_id 
INNER JOIN categories ON product_category_cid = category_id 
INNER JOIN manufacturers ON product_manufacturer = manufacturer_id 
INNER JOIN product_specifications ps1 ON ps1.product_specification_pid=product_id 
INNER JOIN product_specifications ps2 ON ps2.product_specification_pid=product_id 
WHERE  product_active = 1 
    AND ps1.product_specification_sid in (3) 
    AND ps2.product_specification_sid in (8,9,6,7,10,11) 

Tra l'altro, che "gruppo da" non funzionerà. Devi raggruppare per tutto ciò che non è un aggregato e ogni tabella deve avere almeno una colonna, quindi hai almeno tre non aggregati. (Beh, forse MySQL ha qualche estensione qui, ma in SQL standard che sarebbe richiesto.)

+0

come ho detto nella descrizione, l'unione INNER non è una (grande) soluzione poiché deve essere dinamica in termini di quantità di gruppi di specifiche. La query dichiarata da @ a'r ha funzionato e sto usando MySQL come indicato nei tag – PvdL

+0

Se hai una soluzione che funziona, ottima, non c'è bisogno di batterla ulteriormente. Ma sono curioso: perché un join interiore non funziona per te? – Jay

+0

poiché avrò problemi con i risultati. Se vuoi che il tuo metodo funzioni devi aggiungere GROUP BY ID HAVING COUNT (*)> = 2 Per abbinarlo a 2 affermazioni ma se non sono disponibili taglie sarà in grado di far corrispondere i colori . Quindi fondamentalmente nessun mezzo ma blu e nero darà un (falso) positivo. Anche questo è stato il mio primo approccio :) Oltre a questo, se non mi sbaglio tutti questi innerjoin creano molto più carico del metodo sopra – PvdL

Problemi correlati