mysql - 如何从单列创建具有日期间隔的虚拟列

标签 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|  

表格在des列中包含特定sid的日期更改。 每行分别在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`  

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

谢谢

最佳答案

你可以试试这个:

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;

关于mysql - 如何从单列创建具有日期间隔的虚拟列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34150845/

相关文章:

PHP - 无法回显返回数组中的值

mysql - 如何加速这个 DELETE/LEFT JOIN mysql 查询?

php - Phalcon db 连接到同一主机上的多个数据库

mysql - 如何对两个表进行并集运算?

mysql - 想要在子查询中使用 Between 子句

mysql - 为什么 MySQL DELETE 不能在子查询上使用索引?

mysql 检查子查询中的值

php - 从数据库中检索数据时的不同值

SQL Server View 优化帮助(重复子查询、case when 等等...)

mysql - 强制 INNER JOIN/LEFT JOIN 优先级和组