0

尝试不断地从最低到最高对行进行排序,或者重复使用 MySql。例如:如果一列具有以下值:1,3,2,4,2,1,4,3,5,那么它应该像这样结束 1,2,3,4,5,1,2, 3,4。所以它从最低到最高,但尝试多次从最低到最高排序。

4

3 回答 3

0

没有订单两次只是这个

   ORDER BY column ASC
于 2013-01-16T22:52:20.490 回答
0

让我们假设 PK 是一个唯一的整数。考虑以下...

CREATE TABLE seq(id INT NOT NULL PRIMARY KEY,val INT);

INSERT INTO seq VALUES (8,1),(4,2),(1,3),(2,4),(7,0),(6,1),(3,2),(5,5);

SELECT * FROM seq ORDER BY val;
+----+------+
| id | val  |
+----+------+
|  7 |    0 |
|  6 |    1 |
|  8 |    1 |
|  3 |    2 |
|  4 |    2 |
|  1 |    3 |
|  2 |    4 |
|  5 |    5 |
+----+------+

SELECT x.*
     , COUNT(*) rank 
  FROM seq x 
  JOIN seq y 
    ON y.val = x.val 
   AND y.id <= x.id 
 GROUP 
    BY id 
 ORDER 
    BY rank
     , val;
+----+------+------+
| id | val  | rank |
+----+------+------+
|  7 |    0 |    1 |
|  6 |    1 |    1 |
|  3 |    2 |    1 |
|  1 |    3 |    1 |
|  2 |    4 |    1 |
|  5 |    5 |    1 |
|  8 |    1 |    2 |
|  4 |    2 |    2 |
+----+------+------+
于 2013-01-16T23:12:30.067 回答
0

对于大型集合,半联接操作(草莓答案中的方法)可能会创建一个笨拙的结果集。(再说一次,MySQL 可能有一些优化。)

MySQL 中可用的另一种选择是使用“用户变量”,如下所示:

SELECT r.mycol
  FROM ( SELECT IF(q.mycol=@prev,@seq := @seq + 1,@seq := 1) AS seq
              , @prev := q.mycol AS mycol
           FROM mytable q
           JOIN (SELECT @prev := NULL, @seq := NULL) p
          ORDER BY q.mycol
       ) r
 ORDER BY r.seq, r.mycol

让我解压一下,解释一下它在做什么,从内部查询开始(内联视图别名为r.)。我们告诉 MySQL 获取mycol包含要排序的值的列 ( ),例如 1,3,2 ,4,2,1,4,3,5 我们告诉 MySQL 按升序排列:1,1,2,2,3,3,4,4,5。

现在的“技巧”是使用 MySQL 用户变量,以便我们可以将mycol当前行的mycol值与前一行的值进行比较,然后我们使用它来分配一个升序值,从 1..n 开始独特的价值。

使用该结果集,我们可以告诉 MySQL 首先按分配的序列值排序,然后按 from 的值排序mycol


如果每一行都有一个唯一的 id,那么可以使用相关的子查询来获得等效的结果(尽管这种方法不太可能在大型集合上执行得一样好)

 SELECT r.mycol
   FROM mytable r
  ORDER
     BY ( SELECT COUNT(1)
            FROM mytable q
           WHERE q.mycol = r.mycol
             AND q.id <= r.id
        )
      , r.mycol

这是测试用例的设置:

CREATE TABLE mytable (id INT, mycol INT);
INSERT INTO mytable (id, mycol) VALUES 
(1,1),(2,3),(3,2),(4,4),(5,2),(6,1),(7,4),(8,3),(9,5);
于 2013-01-17T00:09:48.630 回答