我有两张桌子:
things
:+------+----------------+------------+ | id | current_status | created_at | +------+----------------+------------+ | 7770 | active | 2016-08-09 | +------+----------------+------------+
thing_status_tract
:+----------+-------------+-----------+---------------------+ | thing_id | status_from | status_to | changed_at | +----------+-------------+-----------+---------------------+ | 7770 | incomplete | inactive | 2016-08-09 16:26:22 | | 7770 | inactive | active | 2016-08-10 12:31:04 | +----------+-------------+-----------+---------------------+
我需要以下形式的数据。此表具有特定状态及其相应的开始和结束时间戳thing_id
:
+----------+-------------+---------------------+---------------------+
| thing_id | status | status_start_date | status_end_date |
+----------+-------------+---------------------+---------------------+
| 7770 | incomplete | 2016-08-09 00:00:00 | 2016-08-09 16:26:22 |
| 7770 | inactive | 2016-08-09 16:26:22 | 2016-08-10 12:31:04 |
| 7770 | active | 2016-08-10 12:31:04 | now() |
+----------+-------------+---------------------+---------------------+
如何使用 SQL 查询来做到这一点?
当然,我之前的回答只是为了回答你眼前的问题。正如我在评论中提到的,您的数据模型本身存在缺陷。你不仅不应该在历史表中同时保留 'status_from' (prevous_status) 和 'status_to',你也不应该在 THINGS 表中保留状态。这违反了标准数据规范化规则。
您应该做的是从 THINGS 表中删除状态,在两个表之间建立 FK 关系,并在需要时使用适当的查询来导出当前状态。
首先,创建并填充 THINGS 表。我添加了几列只是为了说明该表中应包含的内容:
小号
然后创建并填充历史跟踪表:
还有你的历史报告(和以前一样)
还有你的现状报告