хочу узнать, какого идентификатора списка идентификаторов не существует в таблице my_tab.Я имею в виду, что желаемый вывод должен быть 51, 52, 53, 54 и 55.
Я предполагаю, что с текущим примером данных и списком номеров желаемый вывод будет
| number |
|--------|
| 3 |
| 4 |
| 51 |
| 52 |
| 53 |
| 54 |
| 55 |
Этот запрос допускает пропуски как в списке номеров, так и в табличных данных, как вы видите.
Запрос
SELECT
number_list.number
FROM (
SELECT
1 AS number
UNION
SELECT
2 AS number
UNION
SELECT
3 AS number
UNION
SELECT
4 AS number
# ...
# ...
UNION
SELECT
50 AS number
UNION
SELECT
51 AS number
UNION
SELECT
52 AS number
UNION
SELECT
53 AS number
UNION
SELECT
54 AS number
UNION
SELECT
55 AS number
UNION
SELECT
56 AS number
UNION
# ...
# ...
SELECT
100 AS number
) AS number_list
LEFT JOIN
Table1
ON
number_list.number = Table1.tab_id
WHERE
Table1.tab_id IS NULL
Результат
| number |
|--------|
| 3 |
| 4 |
| 51 |
| 52 |
| 53 |
| 54 |
| 55 |
см. Демонстрацию http://sqlfiddle.com/#!9/31956e/13
Обновление из-за отсутствия комментариев.
Не думаете ли вы, что список номеров увеличится до 1000, почти невозможно сгенерироватьсписок с использованием только Select или до 10000 в любом случае, в котором я почти уверен, что это будет.
Для более динамичного запроса требуются генератор чисел MySQL и вложенные функции подиндексов.
Запрос генератора чисел, который генерирует числа от 1 до 100.Таким образом, запрос работает только для списка номеров до 100 номеров.Если вам нужно больше, просто добавьте новый
CROSS JOIN (
SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS record_<number>
Запрос
SELECT
(@row_number := @row_number + 1) AS row_number
FROM (
SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS record_1
CROSS JOIN (
SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS record_2
CROSS JOIN (SELECT @row_number := 0) AS init_user_param
см. Демонстрацию http://sqlfiddle.com/#!9/31956e
Используйте вложенные функции SUBSTRING_INDEX
для разделения элементов из строки в MySQL.
Запрос
SELECT
SUBSTRING_INDEX(
SUBSTRING_INDEX(
'1,2,3,4,50,51,52,53,54,55,56,100'
,',', 1
)
, ','
, -1
) AS number
см. Демонстрацию http://sqlfiddle.com/#!9/340e01/528
Использованиедва метода и получение нужных вам результатов.
Запрос
SELECT
number_list.number
FROM (
SELECT
DISTINCT
SUBSTRING_INDEX(
SUBSTRING_INDEX(
'1,2,3,4,50,51,52,53,54,55,56,100' #this is the number list
,',', number_generator.row_number
)
, ','
, -1
) AS number
FROM (
SELECT
(@row_number := @row_number + 1) AS row_number
FROM (
SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS record_1
CROSS JOIN (
SELECT 1 AS n UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9 UNION SELECT 10
) AS record_2
CROSS JOIN (SELECT @row_number := 0) AS init_user_param
) AS number_generator
) AS number_list
LEFT JOIN
Table1
ON
number_list.number = Table1.tab_id
WHERE
Table1.tab_id IS NULL
см. Демонстрацию http://sqlfiddle.com/#!9/31956e/35