当前位置:  开发笔记 > 后端 > 正文

在MySQL中生成一个整数序列

如何解决《在MySQL中生成一个整数序列》经验,为你挑选了6个好方法。

我需要使用表/结果集/具有整数n到m的任何内容进行连接.有没有一种简单的方法来获得它而不仅仅是建立表格?

(顺便说一句,那种类型的构造会被称为"元查询"?)

mn受限于某种合理的(<1000)



1> 小智..:

我在网上找到了这个解决方案

SET @row := 0;
SELECT @row := @row + 1 as row, t.*
FROM some_table t, (SELECT @row := 0) r

单个查询,快速,并且完全符合我的要求:现在我可以"编号"从复杂查询中找到的"选择",其中唯一数字从1开始,并为结果中的每一行递增一次.

我认为这也适用于上面列出的问题:调整初始起始值@row并添加限制子句以设置最大值.

顺便说一句:我认为"r"并不是真正需要的.

DDSP


选择的行数来自`some_table`而不是r.如果some_table没有行,则什么也得不到.我用这个来生成一组只需要名称和密码的测试数据.数字序列成为名称,密码只是ENCRYPT('passwd')所以它们都是相同的.为了生成行,我从另一个表中选择,但实际上没有选择任何列.它只给了我一行"some_table"中的每一行,所有这些都带有连续数字.
是的`r`是必需的 - 错误1248:每个派生表必须有自己的别名
+很多,我有点震惊 - 不知道MySQL可以做到这一点.这两个单独的查询可用于重新排序表的子集:`SET @row:= 0`和`UPDATE foo SET position =(@row:= @row + 1)WHERE ORDER BY last_modified ASC`

2> Unreason..:

以下将返回1..10000并且不会那么慢

SELECT @row := @row + 1 AS row FROM 
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t,
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2, 
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3, 
(select 0 union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4, 
(SELECT @row:=0) numbers;


一个解释会很好 - "t - t4"每个包含10行虚拟数据,这些的笛卡尔积为10 ^ 4,即10000行虚拟数据,而外部选择只是rownumber的mysql版本
您可以通过将“ @row:= @row + 1 as row”替换为“ concat(t.0,t2.0,t3.0,t4.0)+ 1 as row”来摆脱变量声明,然后进行排序通过“行”。为了获得准确的结果,您还需要将每个子查询中重复的“选择6”更改为“选择2”(“ 2”当前未使用,但“ 6”被列出两次)。作为奖励,您还可以将每个“全部联合”缩短为“联合”,因为不再有任何重复的行。

3> O. Jones..:

如果您碰巧使用MySQL的MariaDB分支,则SEQUENCE引擎允许直接生成数字序列.它通过使用虚拟(假)一列表来实现.

例如,要生成从1到1000的整数序列,请执行此操作

     SELECT seq FROM seq_1_to_1000;

对于0到11,执行此操作.

     SELECT seq FROM seq_0_to_11;

对于从今天开始的一周的连续DATE值,请执行此操作.

SELECT FROM_DAYS(seq + TO_DAYS(CURDATE)) dateseq FROM seq_0_to_6

DATE从'2010-01-01'开始,连续十年的价值是这样做的.

SELECT FROM_DAYS(seq + TO_DAYS('2010-01-01')) dateseq
  FROM seq_0_to_3800
 WHERE FROM_DAYS(seq + TO_DAYS('2010-01-01')) < '2010-01-01' + INTERVAL 10 YEAR

如果您没有使用MariaDB,请考虑一下.



4> Eugene Yokot..:

MySQL中没有序列号生成器(CREATE SEQUENCE).最近的是AUTO_INCREMENT,它可以帮助你构建表.



5> John Nilsson..:

你可以尝试这样的事情:

SELECT @rn:=@rn+1 as n
FROM (select @rn:=2)t, `order` rows_1, `order` rows_2 --, rows_n as needed...
LIMIT 4

其中order只是一些具有相当大的行集的表的示例.

编辑:原来的答案是错误的,任何功劳应归功于David Poor,他提供了相同概念的实例



6> 小智..:

1到100.000之间的数字序列:

SELECT e*10000+d*1000+c*100+b*10+a n FROM
(select 0 a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t1,
(select 0 b union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
(select 0 c union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3,
(select 0 d union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4,
(select 0 e union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t5
order by 1

我用它来检查某些数字是否不正确,例如:

select * from (
    select 121 id
    union all select 123
    union all select 125
    union all select 126
    union all select 127
    union all select 128
    union all select 129
) a
right join (
    SELECT e*10000+d*1000+c*100+b*10+a n FROM
    (select 0 a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t1,
    (select 0 b union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t2,
    (select 0 c union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t3,
    (select 0 d union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t4,
    (select 0 e union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9) t5
    order by 1
) seq on seq.n=a.id
where seq.n between 121 and 129
and   id is null

结果将是121和129之间的序列数122和124的间隔:

id     n
----   ---
null   122
null   124

也许它可以帮助某人!

推荐阅读
Gbom2402851125
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有