Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/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_Design Patterns_Sequence_Resultset - Fatal编程技术网

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子查询以相同的顺序拥有相同的行,否则您将得到奇怪的结果。