2011-08-17 18 views
6

podría alguien ayudarme a generar una consulta basada en la consulta de abajo.MySQL Query - cláusula WHERE múltiple en 1 columna

Como puede ver, tengo un producto con especificaciones y ciertos grupos que se acumulan en el front-end. Sé el problema, 1 columna no puede tener 2 valores a la vez, pero solo necesito los productos que están en esos 2 grupos.

Para ilustrar, product_specification_sid, ID 2 3 y 4 son los tamaños y de reposo 8 ~ 11 son colores, por lo que me gustaría seleccionar un producto que tiene 2 y 3.

interior de unirse a la mesa de doble ISN' Es una opción ya que los grupos (tamaños, colores) pueden variar en el 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

Publiqué una respuesta que hizo la unión interna dos veces. Pero luego leí tu declaración que decía que ya habías pensado sobre eso. No entiendo por qué dices que no es una opción? – Eljakim

Respuesta

5

Puede utilizar una cláusula having en su lugar.

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

¿Deberían tener condiciones '> 1'? Yo pensaría '> = 1' /'> 0', o '= 1'. –

+1

¡La consulta no funcionó al principio, pero @Sam DeHaan lo solucionó! Reemplacé el> 1 bij> = 1 y funciona como un amuleto! – PvdL

+0

He cambiado la consulta ahora. –

1

Como yo lo entiendo, usted está buscando un registro del producto que tiene dos registros product_specification juego que cumplen ciertas condiciones. Me parece que la solución directa es:

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) 

Por cierto, ese "grupo por" no funcionará. Debe agrupar por todo lo que no es un agregado, y cada tabla debe tener al menos una columna, por lo que tiene al menos tres no agregados. (Bueno, tal vez MySQL tiene alguna extensión aquí, pero en SQL estándar que se necesitaría).

+0

como dije en la descripción, la unión INNER no es una (gran) solución ya que tiene que ser dinámica en términos de cantidad de grupos de especificaciones. La consulta declarada por @ a'r funcionó y estoy usando MySQL como se indica en las etiquetas – PvdL

+0

. Si tiene una solución que funciona, genial, no hay necesidad de seguir avanzando. Pero tengo curiosidad: ¿por qué una unión interna no funciona para ti? – Jay

+0

ya que tendré problemas con los resultados. Si desea que su método funcione, debe agregar GROUP BY ID TENIENDO COUNT (*)> = 2 Para que coincida con 2 instrucciones pero si un tamaño no está disponible, podrá hacer coincidir los colores con . Entonces, básicamente, ningún medio sino azul y negro dará un (falso) positivo. Este fue mi primer acercamiento también :) Además de eso, si no me equivoco, todos esos innerjoins crean mucha más carga que el método anterior – PvdL

Cuestiones relacionadas