布尔表更改的高效SELECT

时间:2014-01-23 11:08:34

标签: php mysql sql

我正在尝试为我正在进行的项目找出有效的查询。

我们将切换状态记录到表中,每次更改时,都会添加一个新值(0或1)。

这是表的简化结构:

 day | hour | state 
-----+------+-------
  10 |    1 |     1  # day 10
  10 |    6 |     0 
  10 |   21 |     1 

  11 |    3 |     0  # day 11
  11 |    6 |     1

  13 |   13 |     0  # day 13
....

现在我们需要进行每日概述,如下所示:

Day 11 : Switch was on during 0-3, 6-24


SELECT * FROM log WHERE day = 11只会给我们[3,0]和[6,1]。从那些我们猜测它开始并开始结束,但第12天怎么样?

SELECT * FROM log WHERE day = 12什么都没有,显然 - 没有任何线索可以猜测。

获得某一天的起始和结束状态的有效且可靠的方法是什么?类似“在第12天之前选择一个条目,在第12天之后选择一个”

1 个答案:

答案 0 :(得分:0)

SELECT 
    day,
    hour,
    state
FROM
    log
WHERE
    day*100+hour 
    BETWEEN
        (SELECT max(day*100+hour) FROM log WHERE day < 12) 
    AND
        (SELECT min(day*100+hour) FROM log WHERE day > 12) 

将为您提供(包括)第12天之前的最后一个条目和第12天之后的第一个条目之间的所有内容。 如果您不需要知道状态何时发生变化,则第二部分可能是不必要的,并且足以知道状态在所选日期的至少午夜之前没有变化。