Mysql 显示更改给定id的给定值的日期
我需要检查给定id的地址何时更改,并显示更改日期以及新旧地址 假设我们有以下数据:Mysql 显示更改给定id的给定值的日期,mysql,sql,Mysql,Sql,我需要检查给定id的地址何时更改,并显示更改日期以及新旧地址 假设我们有以下数据: id address date 1 Long Street 2015-09-20 1 Broad Street 2015-09-30 1 Nice Road 2016-09-30 2 Black Road 2016-09-30 2 White Road 2017-01-01 因此,查询的输出应该是: 1 Long Street Broad Street 201
id address date
1 Long Street 2015-09-20
1 Broad Street 2015-09-30
1 Nice Road 2016-09-30
2 Black Road 2016-09-30
2 White Road 2017-01-01
因此,查询的输出应该是:
1 Long Street Broad Street 2015-09-30
1 Broad Street Nice Road 2016-09-30
2 Black Road White Road 2017-01-01
检查地址更改了哪些ID以及更改了多少次很容易,但我不知道如何显示我实际需要的结果。您可以使用相关子查询获取上一条记录的日期:
select t.id,
(select t2.address
from t t2
where t2.id = t.id and t2.date < t.date
order by t2.date desc
limit 1
) prev_address,
t.address, t.date
from t
having prev_address is not null;
having子句的使用是一个MySQL扩展。它的行为类似于使用列别名的where子句。您可以使用相关子查询获取上一条记录的日期:
select t.id,
(select t2.address
from t t2
where t2.id = t.id and t2.date < t.date
order by t2.date desc
limit 1
) prev_address,
t.address, t.date
from t
having prev_address is not null;
having子句的使用是一个MySQL扩展。它的行为类似于使用列别名的where子句。理想情况下,您的问题将使用超前/滞后分析函数。由于MySQL不支持它们,一种方法是使用会话变量模拟它们
SET @address = '';
SET @date = '';
SELECT
prev_address,
address,
date
FROM
(
SELECT
id,
@address AS prev_address,
@date AS prev_date,
@address:=address AS address,
@date:=date AS date
FROM yourTable
ORDER BY date
) t
WHERE
COALESCE(prev_date, date) <> date AND
prev_address <> '';
此处演示:
理想情况下,您的问题将使用超前/滞后分析函数。由于MySQL不支持它们,一种方法是使用会话变量模拟它们
SET @address = '';
SET @date = '';
SELECT
prev_address,
address,
date
FROM
(
SELECT
id,
@address AS prev_address,
@date AS prev_date,
@address:=address AS address,
@date:=date AS date
FROM yourTable
ORDER BY date
) t
WHERE
COALESCE(prev_date, date) <> date AND
prev_address <> '';
此处演示:
问题是我使用的是Jasper Reports,而这个库相当迟钝,我需要编写一个简单的查询,而不声明任何变量。@CorrieSparrow Rats.我花了20分钟来回答这个问题。也许戈登的回答会适合你的需要。顺便提一下,我添加了一个演示。MySQL不保证SELECT中表达式的求值顺序。在一个表达式中指定一个变量,然后在另一个表达式中使用它是不安全的。警告非常明确:但是,涉及用户变量的表达式的求值顺序尚未定义@GordonLinoff你能编辑我的查询并更正吗?如果你的评论是真的,那么在MySQL中使用会话变量会有很多错误信息。问题是我使用的是Jasper Reports,而这个库非常迟钝,我需要编写一个简单的查询,而不声明任何变量。@CorrieSparrow Rats..我花了20分钟来回答这个问题。也许戈登的回答会适合你的需要。顺便提一下,我添加了一个演示。MySQL不保证SELECT中表达式的求值顺序。在一个表达式中指定一个变量,然后在另一个表达式中使用它是不安全的。警告非常明确:但是,涉及用户变量的表达式的求值顺序尚未定义@GordonLinoff你能编辑我的查询并更正吗?如果你的评论是真的,那么在MySQL中使用会话变量有很多错误信息。你如何决定Broad Street是在Nice Road之前还是之后?@jarlh:2016年是在2015年之后:-@ThorstenKettner,我现在觉得很愚蠢。。。再来一杯咖啡的时间是我唯一的借口。你怎么决定布罗德街是在尼斯路之前还是之后?@jarlh:2016年是在2015年之后:-@ThorstenKettner,我现在觉得很愚蠢。。。是时候再来杯咖啡了,这是我唯一的借口。