Вибір оператора MySQL із CASE чи IF ELSEIF? Не знаю, як отримати результат


80

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

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

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

Коли відео додаються, їм не присвоюється значення "виставляти", і це має робитись на ходу при додаванні їх до нашого індексу залежно від значень expose_new чи expose_used поточного виробника.

Що я намагаюся отримати, це деталі товару та обчислюване значення, де його можна побачити, виходячи з того, є воно новим чи використаним, і правило / значення, призначене виробнику для всіх їхніх нових або вживаних продуктів. Мені потрібна ця одна цифра для кожного продукту, щоб умовно відобразити її у списку.

Далі не працює, але ви зрозумієте, що я намагаюся зробити. Я спробував це з твердженнями CASE та наступною заявою WRONG 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

Ось дуже хороший ресурс на mysql, якщо інше, виклад справи. Всі пояснюються на прикладах.
RN Kushwaha

Відповіді:


140

Спробуйте цей запит -

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

перехресне Q - запит FROM products t1, manufacturers t2 where t2.id = t1.seller and t1.seller = 4238буде однаковим? Це просто ЛІВО приєднання, чи не так?
Поза

1
Виявляється, під час експериментів я знайшов спосіб використовувати CASE ... CASE, коли status = 'New' і t2.expose_new = 1, потім 1, коли status = 'New' і t2.expose_new = 2, потім 2 і т.д. що, просто вказавши CASE без поля, я міг би визначити їх у кожному операторі, коли це працює.
user409858

1
Як використовувати exposeв якому стані?
NullPointer

Шановний NullPointer Чи можете Ви вирішити мою проблему ?. чи можу я приєднатися до іншої таблиці, використовуючи регістр? щось на зразок цього. вибрати дату, ім'я, код, тип CASE WHEN type = 'top' ВНУТРІШНЄ ПРИЄДНАННЯ lam1 AS l on o.code = l.code ІНШЕ НУЛЬНЕ КІНЦЕВОЕ СПРАВО typr = 'reverse' ВНУТРІШНЄ ПРИЄДНАННЯ lam2 AS l2 on o.code = l2.code ІНШЕ НУЛЕВО КОНЧЕННЯ ВІД наказу AS o
Syed Arif Iqbal

19

Синтаксис:

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

Інший спосіб зробити це - використання вкладених операторів IF. Припустимо, у вас є таблиця компаній, і ви хочете порахувати в ній кількість записів. Зразок запиту буде приблизно таким

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

Тут друга умова IF працює, коли перша умова IF не вдається. Отже, зразком синтаксису твердження IF буде IF (CONDITION, THEN, ELSE). Сподіваюся, це комусь допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.