MySql有条件地提升排序

时间:2013-01-16 22:45:24

标签: mysql sorting

尝试连续地从最低到最高排序行,或者使用MySql重复排序。例如:如果列具有以下值:1,3,2,4,2,1,4,3,5,那么它应该像这样1,2,3,4,5,1,2, 3,4。因此它从最低到最高,但尝试从最低到最高再次排序。

3 个答案:

答案 0 :(得分:0)

这次没有订单两次

   ORDER BY column ASC

答案 1 :(得分: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 |
+----+------+------+

答案 2 :(得分:0)

对于大型集合,半连接操作(来自Strawberry的答案中的方法)可能会产生难以处理的结果集。 (然后,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获取包含{(1}})的列您想要排序的值,例如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首先按照指定的序列值进行排序,然后按mycol的值进行排序。


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

mycol

以下是测试用例的设置:

 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