MySQL CTE - 是否可以迭代数字范围?

标签 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

最佳答案

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 以获得有意义且可靠的行编号,但您在问题的查询中没有。

关于MySQL CTE - 是否可以迭代数字范围?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58550538/

相关文章:

java - 在 java 中设置准备和执行查询

mysql - 查找参加完全相同类(class) SQL 的学生列表

mysql - 优化此 SQL 查询

SQL XML路径转换结果错误

mysql - 如果表中不存在如何插入不同的两列对?

mysql - 如何在 GROUP BY CASE 之后集成 HAVING 子句

带有两个表的 SQL 递归 CTE

sql - 在 INSERT 语句中使用 WITH 子句

mysql - Cron:将数据从服务导入 MongoDB (Meteor)

python - 在需要条件的上下文中指定的非 bool 类型表达式,靠近 ')' - Pyodbc 和 SQL Server