Mysql 以数字模式/顺序返回结果集
我手头有一个问题,那就是根据单个列的值以数字模式/序列获取结果集 假设我有下表:Mysql 以数字模式/顺序返回结果集,mysql,design-patterns,sequence,resultset,Mysql,Design Patterns,Sequence,Resultset,我手头有一个问题,那就是根据单个列的值以数字模式/序列获取结果集 假设我有下表: +-------+ | val | +-------+ | 1 | | 1 | | 1 | | 1 | | 2 | | 2 | | 2 | | 2 | | 3 | | 3 | | 3 | | 3 | +-------+ 我怎样才能做到这一点: +-------+ | val | +-------
+-------+
| val |
+-------+
| 1 |
| 1 |
| 1 |
| 1 |
| 2 |
| 2 |
| 2 |
| 2 |
| 3 |
| 3 |
| 3 |
| 3 |
+-------+
我怎样才能做到这一点:
+-------+
| val |
+-------+
| 1 |
| 2 |
| 3 |
| 1 |
| 2 |
| 3 |
| 1 |
| 2 |
| 3 |
| 1 |
| 2 |
| 3 |
+-------+
奥拉隆提到的案例:
如果其中一个值不足以填补空白,那么预期的行为是什么?假设我们将3中的两个替换为8
+-------+
| val |
+-------+
| 1 |
| 1 |
| 1 |
| 1 |
| 2 |
| 2 |
| 2 |
| 2 |
| 3 |
| 3 |
| 8 |
| 8 |
+-------+
我仍然希望它以数字顺序排列,先是最小的,然后是最大的,然后是最小的,然后是最大的
+-------+
| val |
+-------+
| 1 |
| 2 |
| 3 |
| 8 |
| 1 |
| 2 |
| 3 |
| 8 |
| 1 |
| 2 |
| 1 |
| 2 |
+-------+
这就是我们所说的rownum大黑客。假设您的表名为t,值列名为val。这将给出您要查找的结果
SELECT val /* step 6 */
FROM
(SELECT A.val,
CASE
WHEN A.val <> IFNULL(B.val,-1) THEN @q:=0 /* step 4 */
ELSE @q:=@q+1 /* step 4 */
END AS seq /* step 4 */
FROM
(SELECT @q:=0)r,
(SELECT /* step 1 */
@a:=@a+1 AS n, /* step 1 */
val /* step 1 */
FROM (SELECT @a:= 0)r, T /* step 1 */
ORDER BY val) A /* step 1 */
LEFT JOIN
(SELECT /* step 2, like step 1 */
@b:=@b+1 AS n,
val
FROM (SELECT @b:= 0)r, T
ORDER BY val) B
ON B.n = A.n-1 /* step 3 */
ORDER BY seq,val) s /* step 5 */
一两句解释:
我们需要把你的val表变成
一个val,n表,其中n是行
数
那么我们需要两个这样的
独立行号@a和@b
然后我们需要把他们连在一起
行=要比较的行1偏移量
相邻的val列
然后我们需要应用一个序列
每个val列的编号
重置。也就是说,我们需要付出
序列号1,2,3到1,然后是2,
等等
然后我们需要按顺序排序,然后
瓦尔
那么我们需要隐藏序列号
瞧
哈克,哈克 如果没有足够的3,预期的行为是什么?例如,如果我们将样本3中的两个换成了8个?嗨,aularon,看看更新后的问题=您期望的结果中是否有任何可推导的逻辑?我的意思是,你的结果总是以3行为一对的数字升序吗?你能给出一个psweudo代码/粗略的算法来精确描述规则吗?太棒了!这足以让我开始研究如何集成。谢谢把它集成到一个结果集中而不是整个表中怎么样?如果我理解你的结果集问题,我想你要做的是摆脱第6步,在第1步的子查询中添加一些列,并在我的查询中提到第4步正上方的列名。哦,不管你对第1步的子查询做什么,确保它和步骤2子查询以相同的顺序拥有相同的行,否则您将得到奇怪的结果。