如何按重复顺序排列行?
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
是一个人
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 的第二部分,因为它被初始化为 ''
我有一个 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
是一个人
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 的第二部分,因为它被初始化为''