如何使用单列

时间:2015-12-08 08:05:21

标签: mysql subquery

我有这个表更改,我在其中存储来自另一个表的更改:

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`  

是否有更好的解决方案(就查询处理的速度而言)?

感谢

2 个答案:

答案 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;