2011-12-22 8 views
53

Tengo dos mesas. Uno tiene información del fabricante e incluye las regiones donde pueden vender. El otro tiene sus productos a la venta. Tenemos que limitar la visibilidad del producto según las regiones. Es como si Netflix tuviera videos en su sistema que solo se pueden ver en Todas partes (1), solo en Canadá (2), solo en EE. UU. (3).Declaración de selección de MySQL con CASE o IF ELSEIF? No estoy seguro de cómo obtener el resultado

Estoy tratando de hacer una consulta que me diga dónde se puede ver el producto en función de la configuración en la tabla del fabricante.

Por ejemplo, en la tabla del fabricante, hay dos campos llamados expose_new y expose_used, cada uno de los cuales tendrá un valor de 1,2 o 3 para limitar dónde pueden verse sus videos nuevos o usados.

Cuando se agregan los videos, no se les asigna un valor de 'exposición' y esto se debe hacer sobre la marcha al agregarlos a nuestro índice dependiendo de los valores exprés_nuevo o exposito_ del fabricante actual.

Lo que estoy tratando de obtener es los detalles del artículo y el valor calculado para ver si es nuevo o usado y la regla/valor asignado al fabricante para todos sus productos nuevos o usados. Necesito este dígito único por producto para mostrarlo condicionalmente en una lista.

Lo siguiente no funciona, pero obtendrá la idea de lo que estoy tratando de hacer. He intentado esto con las declaraciones CASE y la siguiente instrucción INCORRECTA IF/ELSEIF.

Cualquier ayuda para depurar esto y apuntarme en la dirección correcta sería apreciado.

SELECT 
t2.company_name, 
t2.expose_new, // 1,2 or 3 
t2.expose_used, // 1,2 or 3 
t1.title, 
t1.seller, 
t1.status, //can be new or used 
(SELECT 
IF(status ='New', 
    (select expose_new from manufacturers where id = t1.seller),1 
) 
ELSEIF(t1.status ='Used', 
    (select expose_used from manufacturers where id = t1.seller),1 
) 
END IF 
) as 'expose' 
FROM `products` t1 
join manufacturers t2 on t2.id = t1.seller 
where t1.seller = 4238 

Aquí es una versión de casos que en realidad parece a ejecutar, pero siempre resulta en el primer valor, no importa lo que pase a ser verdad (en este caso 1). No estoy seguro de que pueda agregar otra prueba con AND en cada instrucción WHEN, pero no da error, solo el resultado incorrecto.

SELECT 
t2.company_name, 
t2.expose_new, 
t2.expose_used, 
t1.title, 
t1.status, 
CASE status 
    when 'New' and t2.expose_new = 1 then 1 
    when 'New' and t2.expose_new = 2 then 2 
    when 'New' and t2.expose_new = 3 then 3 
    when 'Used' and t2.expose_used = 1 then 1 
    when 'Used' and t2.expose_used = 2 then 2 
    when 'Used' and t2.expose_used = 3 then 3 
END as expose 
FROM `products` t1 
join manufacturers t2 on t2.id = t1.seller 
where t1.seller = 4238 
+0

[aquí] (http://a2znotes.blogspot.in/2012/12/control-flow-functions.html) es muy buena fuente de MySQL si no, declaración de caso. Todos se explican con ejemplos. –

Respuesta

100

Intentar esta consulta -

SELECT 
    t2.company_name, 
    t2.expose_new, 
    t2.expose_used, 
    t1.title, 
    t1.seller, 
    t1.status, 
    CASE status 
    WHEN 'New' THEN t2.expose_new 
    WHEN 'Used' THEN t2.expose_used 
    ELSE NULL 
    END as 'expose' 
FROM 
    `products` t1 
JOIN manufacturers t2 
    ON 
    t2.id = t1.seller 
WHERE 
    t1.seller = 4238 
+0

una cruz Q: ¿la consulta 'FROM productos t1, fabricantes t2 donde t2.id = t1.seller y t1.seller = 4238' sería la misma? Esto es solo una unión IZQUIERDA, ¿o no? – Ulterior

+0

Resulta que al experimentar encontré una forma de utilizar el CASO ... CASO cuando estado = 'Nuevo' y t2.exponer_nuevo = 1 luego 1 cuando estado = 'Nuevo' y t2.expose_new = 2 luego 2 etc. Parece que simplemente indicando CASE sin un campo, podría definirlos en cada declaración when y funciona. – user409858

+1

Cómo usar 'exponer' en donde condición? – NullPointer

8

Sintaxis:

CASE value WHEN [compare_value] THEN result 
[WHEN [compare_value] THEN result ...] 
[ELSE result] 
END 

Alternativa: CASO CUANDO [condición] Then Resultado [CUANDO [condición] resultado entonces ...]

mysql> SELECT CASE WHEN 2>3 THEN 'this is true' ELSE 'this is false' END; 
+-------------------------------------------------------------+ 
| CASE WHEN 2>3 THEN 'this is true' ELSE 'this is false' END | 
+-------------------------------------------------------------+ 
| this is false            | 
+-------------------------------------------------------------+ 

Soy uso:

SELECT act.*, 
    CASE 
     WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NULL) THEN lises.location_id 
     WHEN (lises.session_date IS NULL AND ses.session_date IS NOT NULL) THEN ses.location_id 
     WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NOT NULL AND lises.session_date>ses.session_date) THEN ses.location_id 
     WHEN (lises.session_date IS NOT NULL AND ses.session_date IS NOT NULL AND lises.session_date<ses.session_date) THEN lises.location_id 
    END AS location_id 
FROM activity AS act 
LEFT JOIN li_sessions AS lises ON lises.activity_id = act.id AND lises.session_date >= now() 
LEFT JOIN session AS ses ON ses.activity_id = act.id AND ses.session_date >= now() 
WHERE act.id 
Cuestiones relacionadas