我有一个表tbl_registers
,其中包含主键id
和外键collection_id
;我还有另一个表tbl_cross
,其中包含与register_id
相关的外键tbl_registers
和另一个字段number
(请注意,这是一个简单的数值)。
我想知道任何寄存器中缺少的每个数字都属于特定集合。
我已经开始阅读这篇文章:MySQL get missing IDs from table 效果很好。这是查询:
SELECT 1 as gap_starts_at,
(SELECT MIN(t4.id) -1 FROM testtable t4 WHERE t4.id > 1) as gap_ends_at
FROM testtable t5
WHERE NOT EXISTS (SELECT t6.id FROM testtable t6 WHERE t6.id = 1)
HAVING gap_ends_at IS NOT NULL limit 1
UNION
SELECT (t1.id + 1) as gap_starts_at,
(SELECT MIN(t3.id) -1 FROM testtable t3 WHERE t3.id > t1.id) as gap_ends_at
FROM testtable t1
WHERE NOT EXISTS (SELECT t2.id FROM testtable t2 WHERE t2.id = t1.id + 1)
HAVING gap_ends_at IS NOT NULL;
在我的情况下,testtable
是一个查询:只需将testtable
替换为
(
SELECT number
FROM tbl_cross AS cr
WHERE cr.register_id = 235
ORDER BY cr.number ASC
)
并将.id
替换为.number
我有结果。例如:
gap_starts_at | gap_ends_at
20 | 22
48 | 48
59 | 63
我将对此查询进行扩展,以获取每个寄存器的每个缺失值(或每个间隙)。
示例:
register_id | gap_starts_at | gap_ends_at
235 | 20 | 22
235 | 48 | 48
235 | 59 | 63
743 | 11 | 13
743 | 25 | 25
重要提示。我的目标是缺少数字。因此,对于我来说,拥有缺失值的完整列表而不是差距的列表基本上是相同的。我不知道哪种方法效果更好。
register_id | missing_value
235 | 20
235 | 21
235 | 22
235 | 48
743 | 11
743 | 12
743 | 13
你能帮我吗?谢谢。