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