我有一个表,由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
有更好的方法吗?
由于
答案 0 :(得分:0)
只有轻微的改变......我认为>=
只能是=
:
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
您可以添加" ID"使用RANK或ROW_NUMBER(可能是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"
答案 1 :(得分:0)
您可以使用过滤以及order by
和limit
:
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;