Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Базы Данных > Запрос посложнее


Автор: coyl 18.5.2007, 19:47
Что-то тут спрашивают о элементарных запросах в основном. А у меня действительно сложный запрос. Вот к примеру есть таблица с объектами. Поля в ней - id, name. id - это автоинкрементный суррогатный ключ. Предположим, что Объекты добавлялись, и, иногда, удалялись. Получилось что-то типа
Код

1 - ball
2 - employee
3 - smthng
4 - smthng else
5 - mp3 album
7 - yandex
8 - google
10 - dummy
11 - runet
15 - coyl

Как мы видим - в ключах (id) есть дырки. Например, пропущены ключи 6, 9, 12-14.
Так вот задача - найти последний (максимальный) пропущенный ключ, в данном случае - 14.

Вообще это задание для MSSQL, и там реализуется при использовании view'иков. Однако, если есть идеи, как реализовать в любой другой системе (даже можно в два запроса) - буду благодарен.

Хочу заметить, что использование скриптов (php, perl etc.) исключено. Только средствами СУБД.

Хочу также заметить, что зада точно решаемая.

Автор: Golda 18.5.2007, 23:26
Похоже, что так.

Код

SELECT id-1 FROM test_tbl WHERE id NOT IN (
  SELECT t1.id FROM test_tbl AS t, test_tbl AS t1  WHERE t1.id > 1 AND t.id = t1.id-1
) ORDER BY id DESC LIMIT 1


Правда, таблица используется 3 раза. Может, удастся еще оптимизировать запрос

Автор: SelenIT 18.5.2007, 23:38
А если типа такого?
Код

SELECT t1.id - 1 AS missed_id
FROM test_tbl AS t1
LEFT JOIN test_tbl AS t2
ON t2.id = t1.id - 1
WHERE t2.id IS NULL
ORDER BY missed_id DESC LIMIT 1

Т.е. находим наибольший id, перед которым "дырка", и берем предыдущее значение...

Автор: Golda 18.5.2007, 23:53
Да, LEFT JOIN тут сокращает количество операций. Думаю, что это оптимальный вариант

Автор: coyl 20.5.2007, 14:27
Ого вот это да. Это круто! Спасибо! Даже не думал, что так быстро найдётся решение =)

Автор: Glip 20.5.2007, 17:41
Цитата(SelenIT @  18.5.2007,  23:38 Найти цитируемый пост)
Т.е. находим наибольший id, перед которым "дырка", и берем предыдущее значение...

а если нет пропущеных то получим 0, что тоже обрабатываемо. так?

Автор: SelenIT 20.5.2007, 21:11
Ну да. А чем 0 не удовлетворяет заданному условию? ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)