繁体   English   中英

SQL从多个列排序过滤

[英]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

有一个更好的方法吗?

谢谢

独家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并没有真正帮助

您可以使用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 bylimit 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM