MySql有条件地递增排序
不断尝试从最低到最高排序行,或者重复使用MySql。例如:如果一列具有以下值:1,3,2,4,2,1,4,3,5,则它的结尾应为1,2,3,4,5,1,2,3,4。所以它从最低到最高,但多次尝试从最低到最高再次排序。仅此而已,没有两次排序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,
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);