Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.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中查找记录之间的更改_Mysql_Sql_Self Join - Fatal编程技术网

在MySQL中查找记录之间的更改

在MySQL中查找记录之间的更改,mysql,sql,self-join,Mysql,Sql,Self Join,我有一张桌子,在那里我储存了许多储罐中储存的桶数。我每晚午夜在这里存储值,并在任何操作员发起的传输的开始和结束时存储值 我想返回的是自上一个特定储罐事件记录以来的桶数差异。我有正确的自连接ID以获取以前的记录编号,但是桶不正确 这是我目前拥有的 SELECT inventory.id, MAX(inventory2.id) AS id2, inventory.tankname, inventory.barrels, inventory.eventstamp

我有一张桌子,在那里我储存了许多储罐中储存的桶数。我每晚午夜在这里存储值,并在任何操作员发起的传输的开始和结束时存储值

我想返回的是自上一个特定储罐事件记录以来的桶数差异。我有正确的自连接ID以获取以前的记录编号,但是桶不正确

这是我目前拥有的

SELECT
    inventory.id,
    MAX(inventory2.id) AS id2,
    inventory.tankname,
    inventory.barrels,
    inventory.eventstamp,
    inventory2.barrels
FROM 
    inventory
LEFT JOIN
    inventory inventory2 ON inventory2.tankname = inventory.tankname AND inventory2.eventstamp < inventory.eventstamp
GROUP BY
    inventory.id,
    inventory.tankname,
    inventory.barrels,
    inventory.eventstamp
ORDER BY
    inventory.tankname,
    inventory.eventstamp
这将返回以下结果


只需使用相关子查询:

SELECT i.*,
       (SELECT i2.id
        FROM inventory i2
        WHERE i2.tankname = i.tankname AND
              i2.eventstamp < i.eventstamp
        ORDER BY i2.eventstamp DESC
        LIMIT 1
       ) as prev_id,
       (SELECT i2.barrels
        FROM inventory i2
        WHERE i2.tankname = i.tankname AND
              i2.eventstamp < i.eventstamp
        ORDER BY i2.eventstamp DESC
        LIMIT 1
       ) as prev_barrels
FROM inventory i
ORDER BY i.tankname, i.eventstamp;

查询不起作用,因为SELECT中的列不在GROUP BY中且未聚合。这在任何数据库中都是不允许的;不幸的是,MySQL确实允许这样做。

我没有意识到您可以在子查询中引用父列!