MySQL seleccionar a instrução com a capitalização ou se for caso disso? Não sei como obter o resultado

Tenho duas mesas. Um tem informações do fabricante e inclui as regiões onde eles podem vender. O outro tem os seus produtos à venda. Temos de limitar a visibilidade do produto com base nas regiões. Isto é como o Netflix ter vídeos em seu sistema que só podem ser vistos em todos os lugares (1), apenas no Canadá (2), apenas nos EUA (3).

estou tentando fazer uma consulta que me diz onde o produto pode ser visto com base nas Configurações na tabela do fabricante.

para exemplo, na tabela fabricante, existem dois campos chamados expose_new e expose_used cada um dos quais terá um valor de 1,2 ou 3 para limitar onde seus vídeos novos ou usados podem ser vistos.

Quando os vídeos são adicionados, não lhes é atribuído um valor de "exposição", o que se destina a ser feito em tempo real ao adicioná-los ao nosso índice, dependendo dos valores actuais do fabricante expose_new ou expose_used.

O que eu estou tentando obter é os detalhes do item e o valor calculado para sempre que se possa verificar com base no facto de ser novo ou utilizado e na regra/valor atribuída ao fabricante para todos os seus produtos novos ou usados. preciso deste dígito por produto para o exibir condicionalmente numa lista.

[[3]o seguinte não funciona, mas você terá a idéia do que estou tentando fazer. Eu tentei isto com as declarações do caso e a seguinte declaração errada Se/ELSEIF.

Qualquer ajuda para depurar isto e apontar-me na direcção certa seria ... 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

Aqui está uma versão de caso que realmente parece executar, mas sempre resulta no primeiro valor, não importa o que acontece ser verdadeiro (neste caso 1). Não tenho a certeza se posso ter a adição de outro teste com o e em cada declaração quando, mas não dá um erro, apenas o resultado errado.

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

Tenta 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, 2016-06-22 19:56:31

Sintaxe:

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

Alternativa: CASE WHEN [condition] THEN result [Quando [condição] resultar ...]

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                                               | 
+-------------------------------------------------------------+

Eu sou útil:

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, 2017-02-22 15:53:40