2015-10-09 2 views
1

Соответствующие структуры таблицы:Mysql - сравнение двух строк в одной таблице на разные даты

id(INT), reference_id(INT), status(VARCHAR(20)), date(TIMESTAMP) 

Эта запись обновляется один раз в день.

Проблема: Я хочу отобразить каждую запись, где поле статуса, которое является статичным в большинстве случаев, отличается от того, которое было в предыдущий день, таким образом, чтобы показать дату изменения статуса и отображения истории ,

Как?

Псевдо:

Show * where status for today != status for yesterday 

Ранняя логика, но мое ограниченное знание MySQL вызывает меня врезался в стену.

SELECT * from table_name WHERE DATE(date) = CURDATE() 
UNION 
SELECT table_name.status AS yesterday_status WHERE DATE(date) = CURDATE() - 1 

Я тогда буду сравнивать их как в Perl, который не является настолько эффективным, поэтому я надеюсь, что кто-то может поделиться просветлением ...

+0

Дополнительная информация: Для обеих записей reference_id необходимо сопоставить. –

ответ

0

Вот мой подход. Это не совсем то, о чем вы просили, но, может быть, вам понравится мое решение.

http://sqlfiddle.com/#!9/896b4/7

SELECT 
    today.*, 
    yesterday.* 
FROM t_status today 
LEFT JOIN t_status yesterday 
ON DATE(yesterday.date)<DATE(today.date) 
    AND yesterday.reference_id = today.reference_id 
    AND yesterday.status != today.status 
WHERE DATE(today.date) = CURDATE() 
ORDER BY yesterday.date DESC 
LIMIT 1 
; 

UPDATE Или, возможно, я неправильно понял вашу цель, и вам нужно только сравнить Yesterdays статус, не все прошлые статусы. Если это так, вы можете попробовать это INNER JOIN:

http://sqlfiddle.com/#!9/dd61f1/4

SELECT 
    today.*, 
    yesterday.* 
FROM t_status today 
INNER JOIN t_status yesterday 
ON DATE_ADD(CURDATE(),INTERVAL -1 DAY) = DATE(yesterday.date) 
    AND yesterday.reference_id = today.reference_id 
    AND yesterday.status != today.status 
WHERE DATE(today.date) = CURDATE(); 

Вы можете, если возникнут вопросы.

+0

Это тот! Спасибо за это. В результате я понимаю немного больше о соединениях. Хотя мне нужно будет еще больше подстроить его, чтобы это произошло, это помогло мне преодолеть эту стену. Отлично сработано. :) –

0

Ниже запрос показывает запись, наряду с предыдущим запись дня (я предположил, что REFERENCE_ID также присоединиться к citeria, если нет, то просто удалите его)

select t1.*, t2.* from table t1 
left join table t2 on t1.reference_id=t2.reference_id and date(t1.date)-1=date(t2.date) 

Вы даже можете фильтровать его дальше, чтобы отобразить только те пары, где статус предыдущего дня отличается (заметим, что присоединяйтесь к изменениям слева направо, так как если нет предыдущих запись дня, это не изменение статуса):

select t1.*, t2.* from table t1 
inner join table t2 on t1.reference_id=t2.reference_id and date(t1.date)-1=date(t2.date) and t1.status<>t2.status 
0

Я думаю, что запрос должен быть как выбрать * из имя_таблицы где статус <> (выберите * из имя_таблицы где дата = Sysdate-1) Sysdate является использование для Системная дата.

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