我有这个表更改,我在其中存储来自另一个表的更改:
changes
----------------------------
|id| dat |sid| des |
----------------------------
| 1|2015-12-08| 0| change1|
| 2|2015-12-09| 0| change2|
| 3|2015-12-10| 0| change3|
| 4|2015-12-06| 1| change1|
表格包含特定 sid 列 des 的日期更改。 每一行都会在 dat 列中存储迄今为止有效的旧值 des 。
我需要创建此输出:
result
-----------------------------------
|sid| _from | _to | des |
-----------------------------------
| 0| start|2015-12-08|change1|
| 0|2015-12-08|2015-12-09|change2|
| 0|2015-12-09|2015-12-10|change3|
| 1| start|2015-12-06|change1|
我正在使用此查询:
SELECT
`m`.`sid`,
IFNULL((SELECT `s`.`dat`
FROM `changes` `s`
WHERE ((`s`.`sid` = `m`.`sid`) AND (`s`.`dat` < `m`.`dat`))
ORDER BY `s`.`dat` desc LIMIT 1), 'start') AS `_from`,
`m`.`dat` AS `_to`,
`m`.`des`
FROM `changes` `m`
是否有更好的解决方案(就查询处理的速度而言)?
感谢
答案 0 :(得分:0)
此查询应该完成这项工作:
SELECT
id,
IF(@prev_sid != sid OR @prev_dat IS NULL, 'start', @prev_dat) AS '_from',
dat AS '_to',
des,
@prev_sid := sid,
@prev_dat := dat
FROM changes c
, (SELECT @prev_sid := NULL, @prev_dat := NULL) var_init_subquery
ORDER BY sid, dat
有关其工作原理的说明,请参阅我的回答over here。
您还可以在manual中阅读有关用户定义变量的更多信息。
答案 1 :(得分:0)
你可以试试这个:
SELECT
sid
, IF(@sid_old = sid, dat, 'START')
, dat AS _to
, des
, @sid_old := sid AS dummy
FROM changes
, (SELECT @sid_old := '') AS tmp
ORDER BY sid, dat;