Mysql - 在不同的日期比较同一个表中的两个字符串

时间:2015-10-09 13:14:09

标签: 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中比较它们,这不是那么有效,所以我希望有人可以分享一些启示......

3 个答案:

答案 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

答案 1 :(得分:0)

我认为查询应该是这样的 select * from tablename where status&lt;&gt; (从tablename中选择*,其中date = Sysdate-1) Sysdate用于系统日期。

答案 2 :(得分: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
;

更新或者我可能误解了您的目标,您只需要比较昨天状态,而不是所有过去的状态。如果是这样,您可以试试这个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();

如果有任何问题,欢迎您。