arasında değişir ve aralığını seçmek için MySQL SEÇ rekor hemen önce

oy
1

Üç şeyde, a, b ve c devletlerin MySQL tablo var

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

Bir örnek olarak, zaman sınırları zaman> 100 VE süre <170 olarak kullanıcı tarafından seçilir

Ama 1'ine 'a' hemen önce kayıt döndürülen değerini bilmek gerekir. (İd = 2)

Ben 2 ayrı sorguları başvurmadan, bu sorguyu yaratmanın en etkili yolu bulmaya çalışıyorum.

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

Bir sonuç kümesini dönmek için ...

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

Herhangi bir tavsiye gratefully alınan, teşekkürler!

Oluştur 20/10/2018 saat 14:09
kaynak kullanıcı
Diğer dillerde...                            


1 cevaplar

oy
0

Bir yöntem kullanır 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;

Ayrıca kullanabilirsiniz:

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;

alt sorgu hiçbir değer döndürdüğünde Bu, ne yazık ki çalışmıyor. Yani sabit, ancak sorgu zorlaştırmaktadır edilebilir.

Ancak, çözüm ile (aslında gayet 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;

Üzerinde bir dizin varsa Performans açısından bakıldığında, bu tamam olmalıdır time. Herhangi bir değerleri, 100 ya da daha az olduğunda bu da kolayca sorunu ele alır.

Cevap 20/10/2018 saat 14:16
kaynak kullanıcı

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more