在MySQL中使用不同ORDER的一个表上的两个SELECT查询

时间:2019-01-11 10:36:04

标签: mysql select

我有一个表 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 行,这些行首先按排名排序,然后按 Name
  2. 然后选择按 Name
  3. 排序的其余行
  4. 加入这两个部分(联合列表中的行数与原始表中的行数相同),最后
  5. 从此联合列表的 start 行中
  6. 获取 n

示例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新手

1 个答案:

答案 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 列有一些限制,因此我可以对其进行一些优化,并使用较小的数字。