SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 10.05.2011 17:21:47

nexus
Завсегдатай
Зарегистрирован: 26.11.2010
Сообщений: 35

Помогите составить запрос на выборку (+-) n-го количесва записей

Здравствуйте!
Есть задача вывести на странице 20 записей у которых id меньше заведомо заданного значения (CONST)  и 20 записи у которых этот id больше либо равен CONST

Т.е. к примеру в таблице есть 1000 записей, как одним запросом вывести 20 записей у которых id меньше 600, и 20 записей у которых id больше либо равен 600?

Буду очень признателен за помощь! Спасибо!

Неактивен

 

#2 11.05.2011 11:43:45

nexus
Завсегдатай
Зарегистрирован: 26.11.2010
Сообщений: 35

Re: Помогите составить запрос на выборку (+-) n-го количесва записей

Получилось составить вот такой запрос:


set @n=3, @i=0, @k =0, @p=0;  

SELECT *
FROM table_name
WHERE  (if( @p <= id, @i := @i +1,(@i :=0) OR (@p := 999))) AND (if( @p > id, @k := @k +1,(@k :=0) OR (@p := 999))) AND @k <= @n AND @i <= @n + 1
ORDER BY id asc  
 


где: 999 - искомый id от которого нужно вывести +- 3 строки

Не знаю на сколько он правильный. Но работает! Может кому-то тоже пригодится!

Отредактированно nexus (11.05.2011 11:44:54)

Неактивен

 

#3 11.05.2011 20:16:41

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Помогите составить запрос на выборку (+-) n-го количесва записей

Правильнее будет вот так:

SELECT t.*
FROM (SELECT * FROM table_name ORDER BY id) t
WHERE  (if( @p <= id, @i := @i +1,(@i :=0) OR (@p := 999))) AND (if( @p > id, @k := @k +1,(@k :=0) OR (@p := 999))) AND @k <= @n AND @i <= @n + 1
ORDER BY id asc


потому что если у Вас таблица не упорядочена по id перед тем, как произойдёт проход по ней с переменными - то алгоритм не будет работать.

Отредактированно deadka (11.05.2011 20:24:48)


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#4 11.05.2011 22:19:23

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2420

Re: Помогите составить запрос на выборку (+-) n-го количесва записей

К слову, вместо всего этого шаманства с пользовательскими переменными здесь можно было бы обойтись union'ом.

(select * from t_4234 where id<999 limit 3) union (select * from t_4234 where id>999 limit 3);


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson