В некой таблице бд MySQL `table1` существует поле `id` типа int. Значения `id` идут по порядку от нуля до неизвестного нам числа. Т.е. 0 1 2 3 4 и т.д.
Известно, что одно из значений `id` "потеряно". Тоесть, например - 0 1 3 4 - тут отсутствует двойка, но в нашем случае какое именно число отсутствует мы не знаем. Вот нужно
выцепить это самое пропущенное число всего одним SQL запросом. Сам решения найти не могу... Помогайте

Спустя 13 минут, 17 секунд (7.05.2008 - 13:03) NRG написал(а):
если не секрет, для чего это надо ?
Спустя 1 час, 10 минут, 18 секунд (7.05.2008 - 14:13) sergeiss написал(а):
Я могу предложить только один вариант. Делаешь встроенную процедуру (stored procedure), обращаешься к ней одним-единственным запросом
А уже в этой процедуре находишь пропущенное значение.
Внутри процедуры придется сделать запрос по id, найти в цикле пропущенное значение, и выдать его обратно. С точки зрения программы это будет всего один SELECT.
Если я не прав - можете кинуть в меня тухлыми помидорами, я не сильно обижусь

Внутри процедуры придется сделать запрос по id, найти в цикле пропущенное значение, и выдать его обратно. С точки зрения программы это будет всего один SELECT.
Если я не прав - можете кинуть в меня тухлыми помидорами, я не сильно обижусь

Спустя 4 часа, 22 минуты, 31 секунда (7.05.2008 - 18:36) kirik написал(а):
спрошу тоже что и NRG.. а зачем?
ведь id-шники в базу записываются уникальные, с "ключем" auto increment чтоб случайно не совпали..
а если нужно вывести некие сообщения, или какие-то поля из базы чтобы рядом стояли порядковые номера, то проще взять не теже id номера, а запустить отдельную переменную в цикл вывода полей, которая и будет означать порядковый номер этого поля (pnomer++; ) .. нет?)

ведь id-шники в базу записываются уникальные, с "ключем" auto increment чтоб случайно не совпали..
а если нужно вывести некие сообщения, или какие-то поля из базы чтобы рядом стояли порядковые номера, то проще взять не теже id номера, а запустить отдельную переменную в цикл вывода полей, которая и будет означать порядковый номер этого поля (pnomer++; ) .. нет?)
Спустя 1 час, 54 минуты, 45 секунд (7.05.2008 - 20:31) Newto написал(а):
Цитата(sergeiss @ 7.5.2008, 11:13) [snapback]38026[/snapback]
Я могу предложить только один вариант. Делаешь встроенную процедуру (stored procedure), обращаешься к ней одним-единственным запросом
А уже в этой процедуре находишь пропущенное значение.
Внутри процедуры придется сделать запрос по id, найти в цикле пропущенное значение, и выдать его обратно. С точки зрения программы это будет всего один SELECT.
Если я не прав - можете кинуть в меня тухлыми помидорами, я не сильно обижусь

Внутри процедуры придется сделать запрос по id, найти в цикле пропущенное значение, и выдать его обратно. С точки зрения программы это будет всего один SELECT.
Если я не прав - можете кинуть в меня тухлыми помидорами, я не сильно обижусь

Спасибо за предложенное решение

А для чего сие нужно, я сам сказать не могу. Такая задача была поставлена одному моему знакомому человеку на собеседовании. Он ее не решил. И я вот тоже недоумеваю...
Спустя 1 час, 49 минут, 50 секунд (7.05.2008 - 22:20) sergeiss написал(а):
Цитата(Newto @ 7.5.2008, 21:31) [snapback]38046[/snapback]
А для чего сие нужно, я сам сказать не могу. Такая задача была поставлена одному моему знакомому человеку на собеседовании. Он ее не решил. И я вот тоже недоумеваю...
На собеседовании могут предложить и такой вариант, который не имеет решения. И задача будет состоять в том, что человек должен показать широту своего знания и мышления за счет того, что докажет невозможность решения задачи именно в такой постановке, и предложит альтернативные пути решения. Это позволит потенциальному работодателю надеяться, что будущий сотрудник хоть наизнанку вывернется, но найдет решение для возникающих проблем.
Да и просто посмотрели на его реакцию...
Между прочим, мой вариант полностью подходит под определение данной задачи. Потому что не было озвучено никаких ограничений, кроме использования именно одного SQL-запроса

Судя по твоему ответу, ты не совсем представляешь, что такое встроенные в БД функции. Прав я или нет?
Кстати, а что именно ответил знакомый и взяли ли его в итоге на эту работу?
Спустя 7 часов, 33 минуты, 45 секунд (8.05.2008 - 05:54) Adil написал(а):
Я заметил, что чаще стали задавать тут вопросы, которые задают на собеседовании...
Спустя 2 дня, 11 часов, 40 минут, 28 секунд (10.05.2008 - 17:35) Newto написал(а):
Цитата(sergeiss @ 7.5.2008, 19:20) [snapback]38051[/snapback]
Судя по твоему ответу, ты не совсем представляешь, что такое встроенные в БД функции. Прав я или нет?
Угу.. Прав.
Что он ответил я не знаю, а на работу он другую в итоге устроился

Спустя 21 минута, 7 секунд (10.05.2008 - 17:56) Ghost написал(а):
да задачка, кстати, элементарная, для школьника -
имеем длину ряда - n = count(*), с учетом того что 1 число пропущено - (n+1)
сумма всех чисел, от 0 до n s1 = n*(n+1)/2
имеем сумму s2= sum(`field`);
искомое число = s1-s2
зы, не всё упирается в кодинг, иногда надо уметь модель построить и ее свойства заюзать
ау, любители матана, где вы)?
имеем длину ряда - n = count(*), с учетом того что 1 число пропущено - (n+1)
сумма всех чисел, от 0 до n s1 = n*(n+1)/2
имеем сумму s2= sum(`field`);
искомое число = s1-s2
зы, не всё упирается в кодинг, иногда надо уметь модель построить и ее свойства заюзать

ау, любители матана, где вы)?
Спустя 3 часа, 55 минут, 39 секунд (10.05.2008 - 21:51) givotnoe87 написал(а):
Здравая мысль, арифметическая прогрессия, ее сумма (a1+an)*n/2. Фсе четко, вывод - учите матан, программисты

Спустя 3 часа, 6 минут, 1 секунда (11.05.2008 - 00:57) Ghost написал(а):
не, ну можно конечно и заюзать только sql.., без математики.. ну и без процедур конечно..
тогда можно допустить несколько пропущенных значений
эх, где тут тухлые помидоры
тогда можно допустить несколько пропущенных значений
Код
SELECT t1.`id` , t2.id1
FROM `users` AS t1
RIGHT JOIN (
SELECT id -1 AS id1
FROM `users`
) AS t2 ON t1.id = t2.id1
WHERE t1.id IS NULL
FROM `users` AS t1
RIGHT JOIN (
SELECT id -1 AS id1
FROM `users`
) AS t2 ON t1.id = t2.id1
WHERE t1.id IS NULL
эх, где тут тухлые помидоры

Спустя 7 дней, 13 часов, 39 минут, 27 секунд (18.05.2008 - 14:37) sergeiss написал(а):
Цитата(Ghost @ 10.5.2008, 18:56) [snapback]38240[/snapback]
да задачка, кстати, элементарная, для школьника -
имеем длину ряда - n = count(*), с учетом того что 1 число пропущено - (n+1)
сумма всех чисел, от 0 до n s1 = n*(n+1)/2
имеем сумму s2= sum(`field`);
искомое число = s1-s2
зы, не всё упирается в кодинг, иногда надо уметь модель построить и ее свойства заюзать
ау, любители матана, где вы)?
имеем длину ряда - n = count(*), с учетом того что 1 число пропущено - (n+1)
сумма всех чисел, от 0 до n s1 = n*(n+1)/2
имеем сумму s2= sum(`field`);
искомое число = s1-s2
зы, не всё упирается в кодинг, иногда надо уметь модель построить и ее свойства заюзать

ау, любители матана, где вы)?
Да тут мы, эти самые любители

А вот ты мне тогда вот что скажи. А если там всего N чисел, из которых M пропущено, причем M заранее не известно? То тогда твоя модель сразу же разлетается

Потому что если разность равно 6, то пропущены могут быть такие наборы чисел: {6}, {1, 2, 3}, {1, 5}, {2, 4}, т.е. число M может быть равно 1, 2 или 3. А если разность равна 100117? А всего там в базе 500 тысяч записей? Вот и получается, что не всё так просто.
Спустя 8 минут, 34 секунды (18.05.2008 - 14:45) Ghost написал(а):
ну задача же не так ставилась
да и 2-й вариант - тот что без математики идёт, ты недочитал,
хотя в нем есть бага, которую не сразу заметно - если будут пропущены 2 числа подряд - она неотработает, придёццо еще один джоин делать.. так что пригодно исключительно для частных случаев

хотя в нем есть бага, которую не сразу заметно - если будут пропущены 2 числа подряд - она неотработает, придёццо еще один джоин делать.. так что пригодно исключительно для частных случаев
_____________