Как получить все пропущенные номера из столбца id - PullRequest
1 голос
/ 21 октября 2019

Таблица пользователей имеет поле идентификатора в базе данных mysql, а таблица имеет запись ниже в поле идентификатора

| id |

2
3
5
6
9
10
15
16
18
21
25

Я хочу получить строку пропущенных записей, как показано ниже: -

1
4
7
8
11
12
13
14
17
19
20
22
23
24

Ответы [ 2 ]

2 голосов
/ 21 октября 2019

Насколько это круто?

SELECT seq.`id` FROM (
SELECT @row := @row + 1 as `id`
FROM `users` t, (SELECT @row := 0) r
CROSS JOIN `users` t2
) as seq WHERE seq.`id` NOT IN (SELECT `id` FROM `users`) 
AND seq.`id` <= (SELECT max(`id`) from `users`);

Если вы хотите пропустить идентификаторы для аналитических целей, полюбите это:

SELECT CONCAT(dt.missing, IF(dt.`found`-1 > dt.missing, CONCAT(' to ', dt.`found` - 1), '')) AS missing
FROM ( SELECT @rownum:=@rownum+1 AS `missing`,
    IF (@rownum=id, 0, @rownum:=id) AS `found`
 FROM ( SELECT @rownum:=0 ) AS r
 JOIN users
 ORDER BY id ) AS dt
WHERE dt.`found`!= 0;
0 голосов
/ 21 октября 2019

Использовать подход календарной таблицы и подход против объединения:

CREATE TABLE nums (id INT);
INSERT INTO nums (id)
(
    SELECT (t*10+u+1) x FROM
    (SELECT 0 t UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
     SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) A,
    (SELECT 0 u UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION
     SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) B
);

SELECT
    n.id
FROM nums n
LEFT JOIN users u
    ON n.id = u.id
WHERE
    u.id IS NULL
ORDER BY
    n.id;

Демонстрация

Обратите внимание, что в демоверсии и запросе Iне ограничивал высоту диапазона пропущенных номеров, которые возвращаются. Я произвольно использовал последовательность цифр 1..100, но вы можете ограничиться любым размером, который вы хотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...