Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Запрос посложнее, напряги мозг 
V
    Опции темы
coyl
  Дата 18.5.2007, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 13.6.2006

Репутация: нет
Всего: 1



Что-то тут спрашивают о элементарных запросах в основном. А у меня действительно сложный запрос. Вот к примеру есть таблица с объектами. Поля в ней - 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.) исключено. Только средствами СУБД.

Хочу также заметить, что зада точно решаемая.
PM MAIL   Вверх
Golda
Дата 18.5.2007, 23:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 26.3.2007
Где: Ариель, Израиль

Репутация: 6
Всего: 42



Похоже, что так.

Код

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 раза. Может, удастся еще оптимизировать запрос


--------------------
"For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics
PM MAIL   Вверх
SelenIT
Дата 18.5.2007, 23:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 9
Всего: 401



А если типа такого?
Код

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, перед которым "дырка", и берем предыдущее значение...


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
Golda
Дата 18.5.2007, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 460
Регистрация: 26.3.2007
Где: Ариель, Израиль

Репутация: 6
Всего: 42



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


--------------------
"For every problem, there exists a simple and elegant solution which is absolutely wrong." -- J. Wagoner, U.C.B. Mathematics
PM MAIL   Вверх
coyl
Дата 20.5.2007, 14:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 74
Регистрация: 13.6.2006

Репутация: нет
Всего: 1



Ого вот это да. Это круто! Спасибо! Даже не думал, что так быстро найдётся решение =)
PM MAIL   Вверх
Glip
Дата 20.5.2007, 17:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 473
Регистрация: 30.12.2006

Репутация: 1
Всего: 18



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

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


--------------------
user posted image
PM MAIL   Вверх
SelenIT
Дата 20.5.2007, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


баг форума
****


Профиль
Группа: Завсегдатай
Сообщений: 3996
Регистрация: 17.10.2006
Где: Pale Blue Dot

Репутация: 9
Всего: 401



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


--------------------
Осторожно! Данный юзер и его посты содержат ДГМО! Противопоказано лицам с предрасположенностью к зонеризму!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.0472 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.