Как найти отсутствующие данные в массиве или в таблице MySQL?

У меня есть массив, заполненный значениями (идентификаторы Twitter), и я хотел бы найти недостающие данные между самым низким идентификатором и самым высоким идентификатором? Хотите поделиться простой функцией или идеей о том, как это сделать?

Кроме того, мне было интересно, могу ли я сделать то же самое с mySQL? У меня есть индексированный ключ. В данный момент таблица содержит 250 тыс. Строк, поэтому временная таблица и затем объединение не будут очень быстрыми и эффективными. Я мог бы сделать цикл PHP для циклического прохождения данных, но это также заняло бы много времени и много памяти. Могу ли я выполнить конкретный запрос mysql? или я могу как-то использовать функцию сверху с этим?

Спасибо, Джеймс Хартиг http://twittertrend.net

13.12.2008 02:02:31
3 ОТВЕТА
РЕШЕНИЕ

У меня было похожее требование и я написал функцию, которая возвращала бы список пропущенных идентификаторов.

---------------------------
create function dbo.FreeIDs ()
---------------------------
returns @tbl table (FreeID int)

as
begin

    declare @Max int
    declare @i int

    select @Max = MAX(ID) from [TheTable]
    set @i = 0

    while @i < @Max begin
          set @i = @i + 1
          if not exists (select * from [TheTable] where ID = @i) 
             insert into @tbl select @i
    end

    return

end
1
22.02.2010 23:03:37

Вы имеете в виду последовательные идентификаторы?

В таком случае

$new_ids = range($lowid, $highid, 1);
$ids = array_merge($ids, $new_ids);
$ids = array_unique($ids);
sort($ids);

И в SQL (с заполнителями)

SELECT key, other_data from `table` WHERE key > :low_id AND key < :high_id
1
13.12.2008 02:09:30
Ваше заявление SQL не имеет смысла? Было бы просто вернуть все идентификаторы между максимумом и минимумом? Он не найдет пропущенные значения.
James Hartig 13.12.2008 02:29:44
Как вы можете «найти» пропущенные значения ... он извлекает существующие значения и вычитает их из всего диапазона. должен работать
Eran Galperin 13.12.2008 02:33:46
Запрос sql находит все значения в базе данных, которые находятся между высоким и низким ключом. Это то, что я понял для вашего вопроса. Если вы хотите найти ключи, которых нет в базе данных, я думаю, что все решения будут включать временную таблицу (неявную или явную) и объединение.
gnud 13.12.2008 12:45:11

Ваш range () дал мне хорошую идею, ваш код не работал как уникальный, сохраняет уникальные ключи, поэтому я просто остался с результатом работы функций диапазона.

Однако это сработало:

$diff = array_values(array_diff(range(min($array), max($array), 1), $array)); //returns array of incomplete values
1
13.12.2008 02:28:37
Вы можете просто использовать array_values ​​для его решения. Вы не указали, что ключи должны быть сброшены, просто список пропущенных идентификаторов. Но это решение, как если бы я сделал это сам.
OIS 15.12.2008 15:10:06