MySQL:如何使用JOIN扩展缺失值查询

时间:2019-01-17 05:08:16

标签: mysql missing-data

我有一个表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

你能帮我吗?谢谢。

0 个答案:

没有答案