MySQL CTE-是否可以遍历数字范围?

时间:2019-10-24 23:52:54

标签: mysql sql common-table-expression

我很好奇是否可以使用CTE进行类似的查询(“ id”的值可能会有所不同,不一定是连续的)

SELECT
      elt((@mxId := if(@mxId + 1 <= 3, @mxId + 1, 1)), 5, 10, 22, 33) val,
      id
   FROM my_table
   INNER JOIN (SELECT @mxId := 0) tmp;

预期输出:

 val | id
-----+----
5    | 1
10   | 2
22   | 3
5    | 4
10   | 5
22   | 6
5    | 7
10   | 8
22   | 9
5    | 10
10   | 11
22   | 12
5    | 13
10   | 14
22   | 15
5    | 16
10   | 17
22   | 18
5    | 19
10   | 20

2 个答案:

答案 0 :(得分:0)

with my_table_numbered as (
  select ((row_number() over ())-1)%3 as rn_mod, id from my_table
)
select elt(rn_mod+1, 5, 10, 22, 33) as val, id 
from my_table_numbered;

输出:

+------+----+
| val  | id |
+------+----+
| 5    |  1 |
| 10   |  2 |
| 22   |  3 |
| 5    |  4 |
| 10   |  6 |
| 22   |  7 |
| 5    |  8 |
| 10   |  9 |
| 22   | 13 |
| 5    | 14 |
| 10   | 15 |
| 22   | 16 |
+------+----+

您应该在CTE中指定ORDER BY,以获得有意义且可靠的行编号,但是您的问题中的查询中没有一个。

答案 1 :(得分:0)

row_number() OVER ()

这就是魔术-非常感谢