Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySql有条件地递增排序_Mysql_Sorting - Fatal编程技术网

MySql有条件地递增排序

MySql有条件地递增排序,mysql,sorting,Mysql,Sorting,不断尝试从最低到最高排序行,或者重复使用MySql。例如:如果一列具有以下值:1,3,2,4,2,1,4,3,5,则它的结尾应为1,2,3,4,5,1,2,3,4。所以它从最低到最高,但多次尝试从最低到最高再次排序。仅此而已,没有两次排序 ORDER BY column ASC 让我们假设PK是唯一的整数。考虑下面……/P> CREATE TABLE seq(id INT NOT NULL PRIMARY KEY,val INT); INSERT INTO seq VALUES (8,

不断尝试从最低到最高排序行,或者重复使用MySql。例如:如果一列具有以下值:1,3,2,4,2,1,4,3,5,则它的结尾应为1,2,3,4,5,1,2,3,4。所以它从最低到最高,但多次尝试从最低到最高再次排序。

仅此而已,没有两次排序

   ORDER BY column ASC

让我们假设PK是唯一的整数。考虑下面……/P>
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 |
+----+------+------+
创建表序列(id INT非空主键,val INT);
插入序列值(8,1)、(4,2)、(1,3)、(2,4)、(7,0)、(6,1)、(3,2)、(5,5);
按val从顺序订单中选择*;
+----+------+
|id | val|
+----+------+
|  7 |    0 |
|  6 |    1 |
|  8 |    1 |
|  3 |    2 |
|  4 |    2 |
|  1 |    3 |
|  2 |    4 |
|  5 |    5 |
+----+------+
选择x*
,COUNT(*)秩
摘自seq x
连接顺序y
关于y.val=x.val

而y.id对于大型集合,半连接操作(来自草莓的答案中的方法)可能会创建一个笨拙的结果集。(同样,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获取包含要排序的值的列(
mycl
),例如1,3,2,4,2,1,4,3,5,我们告诉MySQL按升序排序:1,1,2,2,3,3,4,4,5

现在的“技巧”是使用一个MySQL用户变量,这样我们就可以将当前行中的
mycl
值与前一行中的
mycl
值进行比较,并使用该值为每个不同的值分配一个从1..n开始的升序值

有了这个结果集,我们可以告诉MySQL先按指定的序列值排序,然后按
mycl
中的值排序


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


是否有其他列确定排序“重新开始”的依据?Mike否,没有其他列。这可能是一个徒劳的练习,因为如何确定值为
1
的行进入第一个插槽,而值为
1
的行进入后续插槽?当数据集看起来像
1,5,4,5,4,3
或类似于没有
1
的数量=
2
的数量=
3
的数量等时会发生什么情况。我认为如果需要这种排序,您需要重新考虑您的方法,或者,您需要在应用程序级别实现逻辑。这里有一个PK列,但我不能使用PK列,因为记录是随机插入的。我所描述的专栏是一个列,上面写着谁是资产的所有者。@MikeBrant查看您的数据集1,5,4,3,结果会是这样的:1,3,4,5,4,5,但如果MySql没有这方面的工具,我将不得不在应用程序级别这样做。这将使它成为1,1,2,2,3,3,4,4,5感谢您发布这篇文章。我最终使用mysql用户变量的策略实现了我的解决方案。
 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);