SQL从多列中排序过滤

时间:2017-08-20 00:17:25

标签: sql

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

有更好的方法吗?

由于

2 个答案:

答案 0 :(得分:0)

独家WHERE分支

只有轻微的改变......我认为>=只能是=

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不是真的帮助

您可以添加" 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 bylimit

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;