powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка каждой n-ой строки
12 сообщений из 12, страница 1 из 1
Выборка каждой n-ой строки
    #33447029
MagicGTS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мне нужно получить каждый n-ый элемент из выборки элементов отсортированых по имени.
к примеру в базе есть:
name1
name2
name3
.....
name8000
Тока оно в базе не подряд лежи, а надо сортировать. Вот из этого набора мне нужна каждая десятая запись, типа чтобы было:
name1
name10
name20
.....
При этом обрабатываю не все записи таблици, я делаю фильтрацию по другим полям. Вобщем из базы нужно выбрать по условию пару тысяч записей, отсортировать, и из этого набора забрать только каждую n-ую.
Тупой вариант с n-ым количеством LIMIT запросов не предлагать.
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33447804
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лимит тут не причем.
Отфильтровать having и срезать по n-ному запросу, например

SET @Counter:=0;
SELECT ID
, IF(@Counter=11,1,@Counter:=@Counter+1) AS C
HAVING C=10 /*это n*/;

Не тестировал конкретно на 10-ю запись, но тестировал работу по переменным.

Возможно такой вариант подойдет?
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33448033
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MagicGTSМне нужно получить каждый n-ый элемент из выборки элементов отсортированых по имени.
к примеру в базе есть:
name1
name2
name3
.....
name8000
Тока оно в базе не подряд лежи, а надо сортировать. Вот из этого набора мне нужна каждая десятая запись, типа чтобы было:
name1
name10
name20
.....
При этом обрабатываю не все записи таблици, я делаю фильтрацию по другим полям. Вобщем из базы нужно выбрать по условию пару тысяч записей, отсортировать, и из этого набора забрать только каждую n-ую.
Тупой вариант с n-ым количеством LIMIT запросов не предлагать.НУ, если лимит не предлагать, то могу преждложить пронумеровать твоё результирующее (отсортированное и отфильтрованое) множетсво, поместить его в подзапрос и далее в обрамляющем запросе наложить условие на порядковый номер :-)
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33448045
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот тебе заготовка - если что, то сам доведи её до ума.
З.Ы.
В примере я использовал табличку TEST, в которой есть всего одно поле - NAME, и есть сто записей вида:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
select *
  from test

Query finished, retrieving results...

  NAME              
-------
name001                        
name002                        
name003                        
name004
.
.
.                        
name099                        
name100                        

 100  row(s) retrieved

Вот запрос, который вернет тебе каждую 10-ю запись:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
select count(test_2.name) as rank, 
       test_1.name
  from test test_1 inner join 
       test test_2 on test_1.name >= test_2.name
group by test_1.name
having mod(count(test_2.name), 10 ) =  0 
order by rank

Query finished, retrieving results...

RANK    NAME
----  -------
   10   name010
   20   name020
   30   name030
   40   name040
   50   name050
   60   name060
   70   name070
   80   name080
   90   name090
  100   name100

 10  row(s) retrieved
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33451672
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Валентин КОтфильтровать having и срезать по n-ному запросу, например

SET @Counter:=0;
SELECT ID
, IF(@Counter=11,1,@Counter:=@Counter+1) AS C
HAVING C=10 /*это n*/;хы... попробовал. Глючит не по-детски. Для наглядности простейший жоин.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
mysql> set @c=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @c:=if(@c=4,1,@c+1) as cc, tmp1.id, tmp2.id from tmp1,tmp2
where tmp2.id>tmp1.id group by tmp1.id order by tmp1.id desc;
+------+----+----+
| cc   | id | id |
+------+----+----+
|    1 | 13 | 16 |
|    2 | 12 | 16 |
|    3 | 11 | 16 |
|    4 | 10 | 16 |
|    1 |  9 | 16 |
|    2 |  8 | 16 |
|    3 |  7 | 16 |
|    4 |  6 |  7 |
+------+----+----+
8 rows in set (0.00 sec)

mysql> set @c=0;
Query OK, 0 rows affected (0.00 sec)

mysql> select @c:=if(@c=4,1,@c+1) as cc, tmp1.id, tmp2.id from tmp1,tmp2
 where tmp2.id>tmp1.id group by tmp1.id having cc=4 order by tmp1.id desc;
+------+----+----+
| cc   | id | id |
+------+----+----+
|    1 | 10 | 16 |
|    1 |  7 | 16 |
+------+----+----+
2 rows in set (0.00 sec)
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33452329
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так это проблема сортировки значений, а не счетчика, в чем глюк, разве не видно?
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33452807
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
глюк в том, что мускуль не гарантирует удачность такого трюка.
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33452936
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoглюк в том, что мускуль не гарантирует удачность такого трюка.
Ничего подобного, только кривые руки не гарантируют сделать выборку, которую нужно :) все остально разрешимо...
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33455071
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
почему? Я ведь всего лишь having добавил. В исходном-то запросе всё нормально пронумеровалось.
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33455248
Фотография Валентин К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно ошибка, проверял на 5.0.15.
Видимо having на самом деле не может по внешнему уровню результирующего набора действовать, обгоняет на каждом витке нумерации в ID на 1, т.е. возвращает предыдущее...

На 100% не поручусь, но что-то подобное на 4.0 я делал....
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33455305
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в том-то и дело, что не обгоняет, четвёртую строчку-то правильно выдал.
мускуль, кажется, официально заявил об отсутствии корректной подержки такого трюка. Поля, вычисляемые через переменные - это только для клиента.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
Выборка каждой n-ой строки
    #33456455
Фотография Dinky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И вообще, простые решения обычно самые эффективные :)
Создать временную таблицу или массив - заполнить его в циклe запросом вида:
Код: plaintext
1.
SELECT min(id), max(id) FROM 
(SELECT id FROM table WHERE id>$last_id ORDER BY id LIMIT  10 )

Dmitry
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка каждой n-ой строки
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]