【问题标题】:How to order rows in a repeating sequence?如何按重复顺序对行进行排序?
【发布时间】:2017-05-05 18:42:50
【问题描述】:

我有一张这样的桌子:

+----+--------+--------------------+
|  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 行都是唯一的。

怎么做?

【问题讨论】:

  • 这种逻辑是什么?我猜是因为 banana 是第一个在 secuence 上应该是 1
  • @JuanCarlosOropeza 我想在一段时间内按页面列出 PHP 中的所有表行。而且我想要每一次传球都有一套独特的水果。请注意,水果的 ID 每次都不同,在现实世界中,我的表中有一些其他列,其中包含一些数据。
  • 再解释一下逻辑是什么。
  • @JuanCarlosOropeza 想象一下其中包含唯一数据的某个表,其中包含一个带有一些重复值的列“Fruit”。我想逐页请求表格的行(比如一页上有 10 个结果),每页上都有唯一的“水果”列值。
  • @JuanCarlosOropeza 我已经编辑了表格来澄清它。

标签: mysql sorting unique sequence


【解决方案1】:

试试这个:

首先我使用变量来查看每个水果的第一个分隔符是什么。这样我就可以一起展示每个水果的第一个幻影(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 的第二部分,因为它被初始化为 ''

【讨论】:

  • 太棒了!它完全符合我的需要!非常感谢@JuanCarlosOropeza!
  • 哪一部分你不明白?
  • T 表内的所有内容
  • 我补充一些解释,希望有所帮助。
  • 我不是在批评,但我会将@rn := IF(@fruit = Fruit, @rn + 1, if(@fruit := Fruit, 1, 1)) as rn 分解为@rn := IF(@fruit = Fruit, @rn + 1, 1) AS rn, @Fruit := Fruit AS currentFruit。它更易于阅读,并且因轻微修改而产生副作用的风险更低。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-07-25
  • 2021-04-23
  • 2018-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多