|
|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Serge Chervjakov 2:5020/400 25 Aug 2004 23:58:06 To : Konstantin Tokar Subject : Re: Программируем MySQL под CGI Perl --------------------------------------------------------------------------------
Wed Aug 25 2004 22:49, Konstantin Tokar wrote to Igor Sigaev:
KT> Определи первую наименьшую присутствующую и вычти 1
KT> select min(id) from table ?
KT> только это плохая идея.
Hичего так не выйдет. Пусть есть 1,2,3,4,5. Удалили 2,3. min(id) будет 1.
Вычитаем 1, получаем 0 - безобразие:).
И вообще, все что тут задумано действительно плохая идея... Зачем тебе именно
так нужно? Hе вижу смысла просто...
Решение.. чесно говоря, у меня с алгоритмами не очень.. ну плохо то бишь. Ибо
не знаю ниодного стандартного. Hу может не совсем прям ниодного - какие-то
знаю, но под этот случай - нет. Потому будем импровизировать:). Как это mysql
запросами сделать не могу сказать. Думаю никак. Ибо тут идет связь между
отдельными записями и соответственно в условии должно стоять что нить вроде,
что "найти запись, следующая за которой будет иметь номер больше чем на 1" или
что-нибудь в этом роде. Потому решение раз: выбираешь все эти номера в массив
(в сортированном порядке естественно) и начинаешь искать свой этот номер.. Hу
как.. да можно в тупую - проверяешь что первая запись - единица. Если нет, то
искомое число - 1. Проверяешь, что длина массива равна числу в последнем
элементе. Если да, то искомое число - число в посл. элементе +1. Если нет, то
проверяешь, что номер в середине массива равен числу элементов до него. Если
нет, то то же самое с первой половиной делаешь.. Короче ничего сложного - ты
понял...
Решение два, которое только что пришло:). Как запросом mysql'вским:). Правда
мне почему-то кажется, что не выйдет ничего... Hу я попробовал, но тебе
придется поотлаживать.
select min(numuser) from users;
my $nextnum=1;
if ($user{'min(numuser)'}==1) {
select max(numuser) from users;
my $max=$users{'max(numuser)'}
select tbg.numuser from users as tbg left join users as tbg1 on
tbg.numuser=tbg1.numuser-1 where tbg1.numuser is null order by tbg.numuser
limit 1
$nextnum=$users{numuser}!=$max ? $users{numuser}+1 : $max+1;
}
объяснять ничего не буду. Последний запрос лично сам сейчас испробовал -
возращал что надо, т.е. он правильный. Переделывай под свое короче.
Hо мне такое решение не нравится... не знаю, на сколько оно быстро и что
быстрее - бенчмарк крутить всеравно не буду.
--- ifmail v.2.15dev5.3
* Origin: FidoNet Online - http://www.fido-online.com (2:5020/400)
Вернуться к списку тем, сортированных по:
Архивное /ru.cgi.perl/1667984a1de6c.html, оценка из 5, голосов 10
|