mysql选择range前面的记录并选择range

g6ll5ycj  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(312)

我有一个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

例如,用户将时间的界限选择为时间>100和时间<170
但是我需要在第一条返回的记录之前知道'a'的值(其中id=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

如有任何建议,我们将不胜感激,谢谢!

z4iuyo4d

z4iuyo4d1#

一种方法使用 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;

唉,当子查询不返回任何值时,这就不起作用了。这是可以修复的,但会使查询复杂化。
但是,您的解决方案实际上很好(使用 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;

从性能的Angular 来看,如果您在 time . 当没有小于等于100的值时,这也很容易处理问题。

相关问题