我有一个表 Table ,其中有三列: id,Name 和 Rank
id Name Rank
0 A 1
1 B 0
2 C 0
3 D 1
id 是唯一索引,在这种情况下不重要。该表未按 Name 排序,并且 Name 不是唯一的(这只是简单的示例)。
在伪代码中,我需要执行以下操作( r , n , skip 是整数参数):
Temp_A = SELECT * FROM Table ORDER BY Rank, Name
Temp_B = SELECT * FROM Temp_A LIMIT r (1)
Temp_C = SELECT * FROM Temp_A OFFSET r ORDER BY Name (2)
Result = SELECT * FROM (Temp_B + Temp_C) OFFSET skip LIMIT n (3+4)
(Temp_A + Temp_B)表示表的串联
说明:
示例1 :如果 r = 1且 n = 4且 start = 0,则结果应为与原始表格相同:
id Name Rank
0 A 1
1 B 0
2 C 0
3 D 1
示例2 :如果 r = 2, n = 4且 start = 0,则结果应为:
id Name Rank
0 A 1
3 D 1
1 B 0
2 C 0
示例3 :如果 r = 2, n = 3且 start = 1,则结果应为:
id Name Rank
3 D 1
1 B 0
2 C 0
是否可以通过单个MySQL查询(5.5版)来实现?
背景
我需要获取按名称排序的行的列表,但是在第一个 r 位置上应该有优先级更高的行(行)。没有行应出现两次。参数 n 和 skip 用于分页(一页上会有 n 行)。
谢谢您的提示,我是MySQL新手
答案 0 :(得分:0)
我想我明白了
(SELECT *, 0 as SortKey
FROM table
ORDER BY Rank, Name LIMIT r
)
UNION
(SELECT *, 1 as SortKey
FROM table
ORDER BY Rank, Name LIMIT r, 999999
)
ORDER BY SortKey, Name LIMIT skip, skip+n
999999表示“大数字”(必须> COUNT表)。我对 Rank 列有一些限制,因此我可以对其进行一些优化,并使用较小的数字。