penis_19_cm ([info]penis_19_cm) wrote,
@ 2007-08-26 00:16:00
Previous Entry  Add to memories!  Tell a Friend  Next Entry
Экзаменационное задание
Придумал задачку для собеседования с программистом.

Есть таблица:
CREATE TABLE test (
      id int not null unique key,
      ...
);

INSERT INTO test (id) VALUES (1), (5), (4), (3), (2), (100), (101), (200);


Нужно найти минимальный незанятый id (в нашем примере - это 6). Чего думаете, просто/сложно? Ситуация, кстати, не поверите, из жизни, про таблицу, где нельзя использоавть auto_increment.



(13 comments) - (Post a new comment)


[info]g100m
2007-08-25 09:51 pm UTC (link)
select test.id + 1 from test left join test test2 on (test.id + 1 = test2.id) where test2.id is null order by test.id limit 1;

Как-то не особенно тривиально получилось. Хорошая задачка

(Reply to this) (Thread)


[info]uisky
2007-08-25 09:57 pm UTC (link)
Умница!
Соберёшься переезжать в Питер - звони, возьмём на работу.
Хотя, у вас в Волгограде такие бабы, что я бы там навек поселился :)

(Reply to this) (Parent)(Thread)


[info]g100m
2007-08-25 10:15 pm UTC (link)
О да, их у нас хватает )

(Reply to this) (Parent)


[info]ziavra
2007-08-27 07:49 pm UTC (link)
Чего-то тут подумалось, можно как-то так, наверное
select min(rownum) from
(SELECT @rownum:=@rownum+1 rownum, t.*
FROM (SELECT @rownum:=0) r, test t order by t.id)
where rownum<>id
минус джойн, но плюс полный просмотр таблицы, честно говоря очень смутно представляю оптимизацию запросов в mysql :-)

(Reply to this) (Parent)(Thread)


[info]g100m
2007-08-27 08:12 pm UTC (link)
Легко. Достаточно вставить пару-другую миллионов строк и взять старенький компьютер )

(Reply to this) (Parent)


[info]q_styler
2007-08-26 08:31 am UTC (link)
Ещё одна прикольная задачка:

Нужно из заданной таблицы удалить записи, так чтобы не осталось повторений по определённому полю
например

CREATE TABLE test (
id int not null unique key,
norepeat varchar(255) not null,
...
);

(Reply to this) (Thread)


[info]ziavra
2007-08-26 02:37 pm UTC (link)
delete FROM test
WHERE id in (
select
m1.id
FROM test m1
, test m2
WHERE m1.norepeat=m2.norepeat
AND m1.id>m2.id
)

(Reply to this) (Parent)


[info]bolk
2007-08-27 07:42 am UTC (link)
Отрицательные числа и ноль не считаются?

(Reply to this) (Thread)


[info]uisky
2007-08-27 08:44 am UTC (link)
А если считаются?

(Reply to this) (Parent)(Thread)


[info]bolk
2007-08-27 09:07 am UTC (link)
Тогда минимальный незанятый не 6, мм?

(Reply to this) (Parent)(Thread)


[info]uisky
2007-08-27 05:15 pm UTC (link)
Мотематек! :)

(Reply to this) (Parent)


[info]sda
2007-11-30 01:14 pm UTC (link)
Я предлагаю ресетнуть seed на таблице, вставить новую запись, узнать ласт инсерт ИД, запомнить и откатить вставку.

(Reply to this)


(Anonymous)
2009-06-23 09:23 am UTC (link)
select min(test.id+1) from test where test.id+1 not in (select test.id from test);

(Reply to this)


(13 comments) - (Post a new comment)

Create an Account
Forgot your login or password?
Login w/ OpenID
English • Español • Deutsch • Русский…