MySQL SELECT在范围和选择范围之前立即记录

时间:2018-10-20 14:09:09

标签: mysql sql

我有一个MySQL状态表,用于说明a,b和c这三种情况

id  a   b   c   time
--------------------------
1   0   1   1   78
2   1   1   0   89
3   1   0   0   105
4   0   0   0   107
5   1   0   1   122
6   0   0   1   134
7   0   1   0   167
8   1   1   1   168
9   0   1   0   177
10  0   0   0   180

例如,用户选择时间范围为time> 100 AND时间<170

但是我需要知道第一条返回记录之前的'a'值。 (其中id = 2)

我正在尝试找到创建此查询的最有效方法,而不求助于2个单独的查询。

SELECT  a, time FROM states WHERE time<100 order by time DESC limit 1
AND
SELECT  a, time FROM states WHERE time>100 AND time<170 ORDER BY time ASC

返回...的结果集

a   time
1   89
1   105
0   107
1   122
0   134
0   167
0   168

我们将不胜感激收到任何建议,谢谢!

1 个答案:

答案 0 :(得分:0)

一种方法使用LEAD()

SELECT  a, time
FROM (SELECT s.*, LEAD(time) OVER (ORDER BY time) as next_time
      FROM states s
     ) s
WHERE next_time > 100 AND time < 170;

您还可以使用:

select s.*
from states s
where s.time >= (select s2.time from states s2 where s2.time <= 100 order by s2.time desc limit 1) and
      s.time < 170;

a,这在子查询不返回任何值时不起作用。可以解决,但是会使查询复杂化。

但是,您的解决方案实际上很好(使用union all):

(SELECT  a, time
 FROM states
 WHERE time <= 100 
 ORDER BY time DESC 
 LIMIT 1
) UNION ALL
(SELECT  a, time
 FROM states
 WHERE time > 100 AND time < 170
)
ORDER BY time ASC;

从性能的角度来看,如果在time上有索引,则应该可以。当值不小于100时,这也很容易解决该问题。