MySQL: как расширить запрос отсутствующих значений с помощью JOIN - PullRequest
0 голосов
/ 17 января 2019

У меня есть таблица tbl_registers, которая содержит первичный ключ id и внешний ключ collection_id; У меня также есть другая таблица tbl_cross, которая содержит внешний ключ register_id, связанный с tbl_registers, и другое поле number (обратите внимание, что это простое числовое значение). Я хочу знать, что каждое пропущенное число из любого регистра принадлежит определенной коллекции.

Я начал читать этот пост: MySQL получает пропущенные идентификаторы из таблицы Работает отлично. Это запрос:

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

То, что я хотел бы, это расширение этого запроса, чтобы получить каждое пропущенное значение (или каждый пробел) для каждого регистра.

* 1 028 * Пример:
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

Вы можете мне помочь? Спасибо.

...