我有一个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
我们将不胜感激收到任何建议,谢谢!
答案 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时,这也很容易解决该问题。