Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 显示更改给定id的给定值的日期_Mysql_Sql - Fatal编程技术网

Mysql 显示更改给定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的地址何时更改,并显示更改日期以及新旧地址

假设我们有以下数据:

 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,我现在觉得很愚蠢。。。是时候再来杯咖啡了,这是我唯一的借口。