MySQL在值序列中查找缺失的间隙

MySQL在值序列中查找缺失的间隙,mysql,Mysql,在mysql中,我尝试将缺失的间隙放入列表,但没有成功,但我不知道如何 我的数据是: Cuenta ---------- A01 A02 A03 A05 A08 A10 我需要得到以下结果: Cuenta ---------- A04 A06 A07 A09 谢谢 您可以使用所需序列中的所有值生成一个临时表,您可以使用以下准备好的语句: SELECT A.val FROM ( SELECT CONCAT('A', LPAD((@var_i := @var_i + 1), 2, 0))

在mysql中,我尝试将缺失的间隙放入列表,但没有成功,但我不知道如何

我的数据是:

Cuenta
----------
A01
A02
A03
A05
A08
A10
我需要得到以下结果:

Cuenta
----------
A04
A06
A07
A09

谢谢

您可以使用所需序列中的所有值生成一个临时表,您可以使用以下准备好的语句:

SELECT A.val
FROM (
    SELECT CONCAT('A', LPAD((@var_i := @var_i + 1), 2, 0)) val
    FROM (SELECT @var_i := 0) A0
    CROSS JOIN (SELECT NULL UNION ALL SELECT NULL) A1 -- 2^1
    CROSS JOIN (SELECT NULL UNION ALL SELECT NULL) A2 -- 2^2
    CROSS JOIN (SELECT NULL UNION ALL SELECT NULL) A3 -- 2^3
    CROSS JOIN (SELECT NULL UNION ALL SELECT NULL) A4 -- 2^4
    CROSS JOIN (SELECT NULL UNION ALL SELECT NULL) A5 -- 2^5
    CROSS JOIN (SELECT NULL UNION ALL SELECT NULL) A6 -- 2^6
    CROSS JOIN (SELECT NULL UNION ALL SELECT NULL) A7 -- 2^7
    LIMIT 99 -- 2^7 > 99 > 2^6, length 2 table should be cross joined at least 7 times
) A
LEFT JOIN `table` t ON A.val = t.Cuenta
WHERE t.Cuent IS NULL
;
SET @n = 10;
set @i = 1;
-- query to generate sequence
SET @t = CONCAT('SELECT 1 AS n', REPEAT(' UNION ALL SELECT @i := @i + 1', @n - 1));
-- query to insert sequence into temporary table
SET @s = CONCAT("CREATE TABLE tmp SELECT CONCAT('A', LPAD(n, 2, 0)) AS Cuenta FROM (", @t, ") t");
PREPARE stmt FROM @s;
EXECUTE stmt;
+--------+
| Cuenta |
+--------+
| A01    |
| A02    |
| A03    |
| A04    |
| A05    |
| A06    |
| A07    |
| A08    |
| A09    |
| A10    |
+--------+
您的临时表如下所示:

SET @n = 10;
set @i = 1;
-- query to generate sequence
SET @t = CONCAT('SELECT 1 AS n', REPEAT(' UNION ALL SELECT @i := @i + 1', @n - 1));
-- query to insert sequence into temporary table
SET @s = CONCAT("CREATE TABLE tmp SELECT CONCAT('A', LPAD(n, 2, 0)) AS Cuenta FROM (", @t, ") t");
PREPARE stmt FROM @s;
EXECUTE stmt;
+--------+
| Cuenta |
+--------+
| A01    |
| A02    |
| A03    |
| A04    |
| A05    |
| A06    |
| A07    |
| A08    |
| A09    |
| A10    |
+--------+
现在,您可以连接两个表并找到您要查找的内容:

SELECT tmp.Cuenta
FROM tmp
LEFT JOIN tbl ON tbl.Cuenta = tmp.Cuenta
WHERE tbl.Cuenta IS NULL
;
结果将是:

+--------+
| Cuenta |
+--------+
| A04    |
| A06    |
| A07    |
| A09    |
+--------+

免责声明:这种方法适用于小型数据集,但对于大型数据集,不幸的是,行为尚未确定。

A00呢?A11?A99?看:“我尝试过但没有成功…”我没有看到任何代码。嗯?你输了me@Strawberry补充评论。如有必要,你能详细说明一下吗?