Оператор выбора MySQL с CASE или IF ELSEIF?Не уверен, как получить результат - PullRequest
68 голосов
/ 22 декабря 2011

У меня есть две таблицы.Каждый имеет информацию о производителе и включает регионы, где они могут продавать.У другого есть свои продукты для продажи.Мы должны ограничить видимость продукта в зависимости от регионов.Это похоже на то, как в Netflix есть видео в своей системе, которые можно просматривать только везде (1), только в Канаде (2), только в США (3).

Я пытаюсь сделать запрос, который говорит мне, гдепродукт можно просмотреть на основе настроек в таблице производителя.

Например, в таблице производителя есть два поля, называемые expose_new и expose_used, каждое из которых будет иметь значение 1,2 или 3, чтобыограничить область просмотра их новых или использованных видео.

Когда видео добавляются, им не присваивается значение «выставить», и это предполагается сделать на лету при добавлении их в наш индекс в зависимости отзначения expose_new или expose_used текущего производителя.

Я пытаюсь получить подробности об элементе и вычисленное значение, где его можно увидеть на основе того, является ли оно новым или использованным, а также назначенное правило / значениепроизводителю для всех их новых или использованных продуктов. Мне нужна эта единственная цифра для каждого продукта, чтобы условно отобразить ее вlist.

Следующее не работает, но вы поймете, что я пытаюсь сделать.Я попытался сделать это с помощью операторов CASE и следующего НЕПРАВИЛЬНОГО оператора IF / ELSEIF.

Любая помощь в отладке этого и указании мне правильного направления будет принята с благодарностью.

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

ВотВерсия CASE, которая на самом деле, кажется, выполняется, но всегда приводит к первому значению, независимо от того, что происходит в действительности (в данном случае 1).Я не уверен, что у меня может быть добавление другого теста с AND в каждом операторе WHEN, но это не дает ошибки, только неверный результат.

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

Ответы [ 3 ]

122 голосов
/ 22 декабря 2011

Попробуйте этот запрос -

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
17 голосов
/ 22 февраля 2017

Синтаксис:

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

Альтернатива: СЛУЧАЙ, КОГДА [условие], ТО результат [КОГДА [условие] ПОТОМ результат ...]

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

Я использую:

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
1 голос
/ 27 декабря 2018

Еще один способ сделать это - использовать вложенные операторы IF.Предположим, у вас есть таблица компаний и вы хотите подсчитать количество записей в ней.Пример запроса будет выглядеть примерно так:

SELECT IF(
      count(*) > 15,
      'good',
      IF(
          count(*) > 10,
          'average',
          'poor'
        ) 
      ) as data_count 
      FROM companies

Здесь второе условие IF работает, когда первое условие IF не выполняется.Поэтому примерный синтаксис оператора IF будет IF (СОСТОЯНИЕ, ТО, ДАЖЕ). Надеюсь, это кому-нибудь поможет.

...