[英]SQL ordered filtering from multiple columns
我下面有一张表,同时被mysql和sqlite使用,它按列a,b,c升序排序:
# | a | b | c
--------------------------
0 | 40 | 55 | blue
1 | 60 | 65 | red
2 | 60 | 65 | rose
3 | 60 | 65 | yellow
4 | 80 | 21 | green
5 | 85 | 12 | blue
我想找出任何给定行之后的“下一个”行。 例如,如果我正在查看第2行:
a=60, b=65, c="rose"
我希望能够找出第3行是下一行(我的情况下没有#ID)。
我的幼稚方法是这样的:
select * from table where
(a >= 60 AND b >= 65 AND c > "rose") OR
(a >= 60 AND b > 65) OR
(a > 60)
ORDER BY a, b, c ASC
LIMIT 1
有一个更好的方法吗?
谢谢
只是稍作更改...我认为>=
可以只是=
:
SELECT * FROM table WHERE
(a = 60 AND b = 65 AND c > "rose") OR
(a = 60 AND b > 65) OR
(a > 60)
ORDER BY a, b, c ASC
LIMIT 1
您可以使用RANK或ROW_NUMBER添加“ id”(可能是RANK,因为它将对重复项进行分组)。
// Emulate Rank in MySQL
SELECT @rankInc := @rankInc + 1 AS rank
a,
b,
c
FROM table, (SELECT @curRank := 0) r
GROUP BY a, b, c
ORDER BY a, b, c;
...但是我想不出使用比您发布的查询更好的查询。 我认为您的方法是直接而精益的。
// Best effort using rank
SELECT nr.a, nr.b, nr.c
FROM rankSubquery r
INNER JOIN rankSubquery nr
ON r.rank + 1 = nr.rank
WHERE r.a = 60 AND r.b = 65 AND r.c = "rose"
您可以使用过滤以及order by
和limit
order by
:
select t.*
from t
where (t.a > 60) or
(t.a = 60 and t.b > 65) or
(t.a = 60 and t.b = 65 and c = 'rose')
order by a, b, c
limit 1;
在MySQL中,我想您也可以这样写:
select t.*
from t
where (t.a, t.b, t.c) > (60, 65, 'rose')
order b a, b, c
limit 1;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.