Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Help! Нужен SQL запрос.  (Прочитано 8974 раз)
0 Пользователей и 1 Гость смотрят эту тему.
alexthunder
Гость
« : 20-02-2004 19:13 » 

Есть таблица, скажем с 10.000 записей. Нужно вытащить именно 100 запись. В таблице есть ключевое поле, но в нем числа идут не подряд, т.к. записи удаляются.

Поскольку записей очень много, а БД MySQL находится на другом хосте, то решение вытащить колонку в массив и далее примитивно взять 100 элемент массива не подходит, т.к. будет кушать слишком много траффика.

Nested запрос пробовал, но MySQL его не скушала.

Как же вытащить эту запись? Помогите, пожалуйста! Срочно надо, а я что-то не соображу совсем. Вроде пару хороших книг про SQL посмотрел, а ничего не нашел.
Записан
Alf
Гость
« Ответ #1 : 20-02-2004 20:52 » 

Цитата: alexthunder
Есть таблица, скажем с 10.000 записей. Нужно вытащить именно 100 запись.
...
Вроде пару хороших книг про SQL посмотрел, а ничего не нашел.
Это говорит только о том, что и в самом деле читал хорошие книги по SQL. Потому что с точки зрения реляционной теории кортежи отношения не упорядочены, и СУБД имеет право хранить их (и соответственно выдавать) в любом порядке. Так что говорить, например, о 100-й записи довольно-таки некорректно. Отношение - это все-таки не массив.
Записан
Dobro
Гость
« Ответ #2 : 21-02-2004 02:29 » 

Цитата

Потому что с точки зрения реляционной теории кортежи отношения не упорядочены, и СУБД имеет право хранить их (и соответственно выдавать) в любом порядке. Так что говорить, например, о 100-й записи довольно-таки некорректно.

Про отношения - все верно. Но описанная задача никак не противоречит реляционной теории, так как в таблице есть ключевое поле. Т.е. можно упорядочить выборку данных по этому полю, иначе зачем люди придумали первичные ключи и ORDER BY.

Цитата

Как же вытащить эту запись? Помогите, пожалуйста!

Задачка сводится к нумерации строк в запросе.
Самый "железный" вариант - создание временной таблицы с дополнительным полем типа int identity. На MS SQL Server выглядит все примерно так:
CREATE TABLE #tmp(new_id int identity, my_id int)
INSERT INTO #tmp(my_id) SELECT id FROM mytable
SELECT #tmp.new_id, fields_from_mytable
FROM #tmp INNER JOIN mytable ON #temp.my_id = mytable.id
DROP TABLE #tmp
Записан
Dobro
Гость
« Ответ #3 : 21-02-2004 02:48 » 

Второй вариант - использовать в SELECT операнд TOP n. Для получения N-й строки используется такая конструкция:

SELECT TOP 1 *
  FROM mytable
  WHERE my_id NOT IN
    (SELECT TOP N-1 FROM mytable ORDER BY my_id)

или такая:
SELECT TOP 1 *
  FROM
    (SELECT TOP N FROM mytable ORDER BY my_id)
  ORDER BY my_id DESC
Записан
Dobro
Гость
« Ответ #4 : 21-02-2004 03:30 » 

Не обратил внимания сразу, что речь идет о MySQL. Я в нем не силен, но припоминаю, что в его диалекте есть операнд LIMIT для SELECT. Что-то типа:
SELECT * FROM mytable LIMIT 100, 10
Что означает в MySQL возвратить 10 записей, начиная со 101.
По-моему, это и есть решение вашей проблемы.
Записан
alexthunder
Гость
« Ответ #5 : 21-02-2004 06:29 » 

To Alf:

Естественно считается, что можно упорядочить таблицу, используя GROUP BY, это даже не обсуждается. Иначе и проблемы такой не ставилось бы.

To Dobro:

Спасибо за помощь!
SELECT TOP 1 * FROM  (SELECT TOP N FROM mytable ORDER BY my_id)
ORDER BY my_id DESC

Nested запросы мой MySQL не понимает. Может старый?!
А вот Limit - это действительно то, что нужно.
Так просто вроде.

Еще раз выражаю огромную благодарность!
Записан
Kern
Гость
« Ответ #6 : 05-03-2004 04:58 » 

Для PostgreSQL можно одним селектом обойтись:
SELECT * FROM mytable ORDER BY my_id LIMIT 1 OFFSET 100;
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines