相关的表格结构是:
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 :(得分: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();
如果有任何问题,欢迎您。