2016-03-20 3 views
0

я действительно заблокирован в преклонном запросе, если кто-то может помочь мнеMYSQL - сравнение между 5 датами и порядком последнего

У меня есть таблицы MySQL, который выглядит следующим образом:

клиенты (идентификатор, appointment_date1, appointment_date2, appointment_date3, appointment_date4)

Я ищу запрос, перечисляет мне, что следующее самым недавнее назначение

Перед тем, как сделать этот запрос:

SELECT CASE 
    WHEN (customers.appointment_date1 != '0000-00-00' AND DATE(customers.appointment_date1) >= CURDATE()) THEN customers.appointment_date1 
    WHEN (customers.appointment_date2 != '0000-00-00' AND DATE(customers.appointment_date2) >= CURDATE()) THEN customers.appointment_date2 
    WHEN (customers.appointment_date3 != '0000-00-00' AND DATE(customers.appointment_date3) >= CURDATE()) THEN customers.appointment_date3 
    WHEN (customers.appointment_date4 != '0000-00-00' AND DATE(customers.appointment_date4) >= CURDATE()) THEN customers.appointment_date4 
END as appointment 
ORDER BY appointment ASC 

Но это неправильно, оно работает неправильно.

Любой может помочь?

Благодаря

+0

вам нужно сделать следующий самое недавнее назначение или список следующих последних назначений? – Loufylouf

+1

Вам нужно больше работать, не нормализуя эту структуру. Попробуйте использовать новую таблицу 'tasksments', а не использовать кучу столбцов в таблице клиентов. – Devon

+0

Что значит «не работает правильно»? Не могли бы вы предоставить образцы данных, ожидаемый результат и текущий результат? – piotrgajow

ответ

1

Я бы использовать вложенные MySQL if() функции в select пункте, например:

select * 
from(
    select if(date1<date2&&date1>curdate(),date1, 
      if(date2<date3&&date2>curdate(),date2, 
      if(date3>curdate(),date3, 'nothing') 
      ) 
      ) as date 
    from dates 
) as dates 
order by dates.date desc; 

EDIT: в соответствии с комментарием Зика в

SELECT IF(LEAST(
      IFNULL(date1,'0000-00-00'), 
      IFNULL(date2,'0000-00-00'), 
      IFNULL(date3,'0000-00-00') 
      )!='0000-00-00', 
      LEAST(
      IFNULL(date1,'0000-00-00'), 
      IFNULL(date2,'0000-00-00'), 
      IFNULL(date3,'0000-00-00') 
     ), 
      'aucune date' 
     ) 
FROM dates; 
+0

И почему это? Я думаю, что CASE более читабельна в этом примере. – piotrgajow

+1

с использованием 'CASE' здесь подразумевает, что назначение_определения_1_с_определения__сочетания_создания_имя_имя и т. Д. ... но мы этого не знаем. (в соответствии с https://dev.mysql.com/doc/refman/5.7/en/case.html, "каждое выражение WHUE выражение search_condition оценивается до тех пор, пока оно не будет истинным") – butterFlyNick

+0

Да, вы правы :) – piotrgajow

Смежные вопросы