如何按重复顺序排列行?

How to order rows in a repeating sequence?

我有一个 table 这样的:

+----+--------+--------------------+
|  1 | Apple  | Message 1          |
|  2 | Orange | Message two        |
|  3 | Lime   | Some data          |
|  4 | Banana | More data          |
|  5 | Lime   | Boom. This is data |
|  6 | Pear   | I'm on 6 row       |
|  7 | Orange | Foo and Bar here   |
|  8 | Banana | Remember Baz       |
|  9 | Apple  | Big fat juicy data |
| 10 | Lime   | More values here   |
| 11 | Pear   | I'm almost empty   |
+-------------+--------------------+

我有一些序列,比如:

(Banana, Apple, Orange, Lime, Pear)

所以我需要这样排序:

+----+--------+--------------------+
|  4 | Banana | More data          |
|  1 | Apple  | Message 1          |
|  2 | Orange | Message two        |
|  3 | Lime   | Some data          |
|  6 | Pear   | I'm on 6 row       |
|  8 | Banana | Remember Baz       |
|  9 | Apple  | Big fat juicy data |
|  7 | Orange | Foo and Bar here   |
|  5 | Lime   | Boom. This is data |
| 11 | Pear   | I'm almost empty   |
| 10 | Lime   | More values here   |
+-------------+--------------------+

我怎样才能像这样排序并且还有分页?


或者,通常,我需要对行进行排序,以便结果集中的每 N 行都是唯一的。

怎么办?

试试这个:

首先我使用变量来查看每个水果的第一个apartition是什么。这样我就可以一起展示每个水果的第一个幻影(rn = 1)

然后在 ORDER BY 中使用 CASE 按照您的顺序排序。

我看到的问题是LIME = 3是一个人

SQL DEMO

SELECT `ID`, `Fruit`, `Msg`, rn
FROM (
    SELECT *,
           @rn := IF(@fruit = `Fruit`,
                     @rn + 1,
                     if(@fruit := `Fruit`, 1, 1) 
                    ) as rn
    FROM Table1
    CROSS JOIN (SELECT @rn := 0, @fruit := '') as var
    ORDER BY `Fruit`, `ID`
    ) T
ORDER BY rn, CASE `Fruit`  
                  WHEN 'Banana' THEN 1
                  WHEN 'Apple'  THEN 2
                  WHEN 'Orange' THEN 3
                  WHEN 'Lime'   THEN 4
                  WHEN 'Pear'   THEN 5
             END

输出

提示:

  • CROSS JOIN (SELECT @rn := 0, @fruit := '') as var 此处创建并初始化变量 @rn@fruit
  • ORDER BY Fruit, ID现在我是按水果顺序来的,所以相同的水果放在一起。也按 ID 排序,所以较小的 ID 先出现。
  • @rn := 现在计算每一行的 rn
  • IF(@fruit = Fruit, @rn + 1, if(@fruit := Fruit, 1, 1) )
    • 如果你有相同的水果,你需要增加@rn。比如第一个苹果,第二个苹果等等
    • 如果你得到一个新的 fruit @fruit 会改变,因为我使用 := 并将 @rn 计数器重置为 1。
    • 第一次比较 @fruit = Fruit 时,您选择了 IF 的第二部分,因为它被初始化为 ''