MySQL select sentencia con MAYÚSCULA o SI ELSEIF? No estoy seguro de cómo obtener el resultado


Tengo dos tablas. 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 en función de las regiones. Esto es como Netflix tiene videos en su sistema que solo se pueden ver en todas partes (1), solo en Canadá (2), solo en EE.UU. (3).

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

Para ejemplo, en la tabla manufacturer, 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 se pueden ver sus videos nuevos o usados.

Cuando se agregan los videos, no se les asigna un valor 'expose' y esto se debe hacer sobre la marcha al agregarlos a nuestro índice dependiendo de los valores expose_new o expose_used del fabricante actual.

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

Lo siguiente no funciona, pero usted tendrá la idea de lo que estoy tratando de hacer. He intentado esto con declaraciones de CASO y la siguiente declaración INCORRECTA IF/ELSEIF.

Cualquier ayuda para depurar esto y señalarme en la dirección correcta sería apreciar.

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í hay una versión de CASO que en realidad parece ejecutarse, pero siempre resulta en el primer valor sin importar lo que sucede que sea verdadero (en este caso 1). No estoy seguro de que pueda tener la adición de otra prueba con el Y en cada declaración CUANDO, pero no da un 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
Author: user409858, 2011-12-22

2 answers

Prueba 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
 111
Author: Devart,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-22 19:56:31

Sintaxis:

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

Alternativa: CASO CUANDO [condición] ENTONCES resultado [CUANDO [condición] ENTONCES el resultado ...]

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
 13
Author: Limitless isa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-22 15:53:40