Mysql mysql 1000 000 строк

skalim

Новичок
Доброго времени суток! есть таблица в ней случайные числа от 1 до 1 000 000. Записей в таблице ~1 000 000. Например, 1,2,3,4,5,66,45,34,22...99994,99929...1 000 000. Мне нужно узнать, каких чисел в диапазоне от 1 до 1 000 000 нет в бд.
Пробовал: сделать запрос в бд , сформировать массив на основе этих данных затем создать другой массив с последовательностью от 1 до 1 000 000 далее array_diff($mass2,$mass1). работает, но если данных немного. так же пробовал array_splice тоже работает, если мало данных в бд.
Сейчас думаю искать не занятые числа, а свободные т.е. нужно выбрать из бд строки значение которых равно значение предыдущей +1, но не могу сформулировать sql запрос.Подскажите, пожалуйста, может кто сталкивался?
 

eax

#
Пришло в больную голову такое непроверенное решение. Создать таблицу t2 с id в диапазоне от 1 до 1000000 и создать запрос типа:
PHP:
SELECT * FROM t2 
	LEFT JOIN t1 ON t1.id = t2.id
	WHERE t1.id IS NULL
Что будет с производительностью не предвижу
 

fixxxer

К.О.
Партнер клуба
Узнать все свободные, или первое свободное?
Второе - элементарно джойном на себя.
 

skalim

Новичок
Пришло в больную голову такое непроверенное решение. Создать таблицу t2 с id в диапазоне от 1 до 1000000 и создать запрос типа:
PHP:
SELECT * FROM t2 
	LEFT JOIN t1 ON t1.id = t2.id
	WHERE t1.id = NULL
Что будет с производительностью не предвижу
гм.. данных много
error
PHP:
1 The SELECT would examine more than MAX_JOIN_SIZE rows; check your WHERE and use SET SQL_BIG_SELECTS=1 or SET MAX_JOIN_SIZE=# if the SELECT is okay SQL1.sql 1 1
 

~WR~

Новичок
Почему в Mysql нет нормального нативного generate_series?
Есть хоть какие-то разумные причины?
На мой взгляд, можно было бы написать с нуля за полчаса.
 
  • Like
Реакции: eax

fixxxer

К.О.
Партнер клуба
~WR~
Да-да, я тоже сразу подметил, что на постгресе задача решается элементарно ;)
 

chira

Новичок
генератор на миллион:
Код:
select ed.a+ds.a+hu.a+th.a+dth.a+hth.a id
from 
(select 0 a union all select 1 union all select 2 union all select 3 union all select 4 union all select 5 union all select 6 union all select 7 union all select 8 union all select 9
) ed
,(select 0 a union all select 10 union all select 20 union all select 30 union all select 40 union all select 50 union all select 60 union all select 70 union all select 80 union all select 90
) ds
,(select 0 a union all select 100 union all select 200 union all select 300 union all select 400 union all select 500 union all select 600 union all select 700 union all select 800 union all select 900
) hu
,(select 0 a union all select 1000 union all select 2000 union all select 3000 union all select 4000 union all select 5000 union all select 6000 union all select 7000 union all select 8000 union all select 9000
) th
,(select 0 a union all select 10000 union all select 20000 union all select 30000 union all select 40000 union all select 50000 union all select 60000 union all select 70000 union all select 80000 union all select 90000
) dth
,(select 0 a union all select 100000 union all select 200000 union all select 300000 union all select 400000 union all select 500000 union all select 600000 union all select 700000 union all select 800000 union all select 900000
) hth
) a
-- count(*) из этого селекта
+----------+
| count(*) |
+----------+
|  1000000 |
+----------+
1 row in set (0.36 sec)
left join c приведённым селектом и получишь результат
поиск всех пропущенных значений для миллиона записей по любому будет долго
практическое применение не еффективно
 
  • Like
Реакции: eax
Сверху