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