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

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

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

Возможно такой вариант подойдет?
...
Рейтинг: 0 / 0
21.12.2005, 06:08:19
    #33448033
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
MagicGTSМне нужно получить каждый n-ый элемент из выборки элементов отсортированых по имени.
к примеру в базе есть:
name1
name2
name3
.....
name8000
Тока оно в базе не подряд лежи, а надо сортировать. Вот из этого набора мне нужна каждая десятая запись, типа чтобы было:
name1
name10
name20
.....
При этом обрабатываю не все записи таблици, я делаю фильтрацию по другим полям. Вобщем из базы нужно выбрать по условию пару тысяч записей, отсортировать, и из этого набора забрать только каждую n-ую.
Тупой вариант с n-ым количеством LIMIT запросов не предлагать.НУ, если лимит не предлагать, то могу преждложить пронумеровать твоё результирующее (отсортированное и отфильтрованое) множетсво, поместить его в подзапрос и далее в обрамляющем запросе наложить условие на порядковый номер :-)
...
Рейтинг: 0 / 0
21.12.2005, 06:25:27
    #33448045
Владимор Конев
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
Вот тебе заготовка - если что, то сам доведи её до ума.
З.Ы.
В примере я использовал табличку 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
22.12.2005, 12:37:05
    #33451672
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
Валентин КОтфильтровать 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
22.12.2005, 15:17:24
    #33452329
Валентин К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
Так это проблема сортировки значений, а не счетчика, в чем глюк, разве не видно?
...
Рейтинг: 0 / 0
22.12.2005, 17:49:05
    #33452807
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
глюк в том, что мускуль не гарантирует удачность такого трюка.
...
Рейтинг: 0 / 0
22.12.2005, 18:30:15
    #33452936
Валентин К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
maXmoглюк в том, что мускуль не гарантирует удачность такого трюка.
Ничего подобного, только кривые руки не гарантируют сделать выборку, которую нужно :) все остально разрешимо...
...
Рейтинг: 0 / 0
23.12.2005, 17:10:13
    #33455071
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
почему? Я ведь всего лишь having добавил. В исходном-то запросе всё нормально пронумеровалось.
...
Рейтинг: 0 / 0
23.12.2005, 18:30:20
    #33455248
Валентин К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
Действительно ошибка, проверял на 5.0.15.
Видимо having на самом деле не может по внешнему уровню результирующего набора действовать, обгоняет на каждом витке нумерации в ID на 1, т.е. возвращает предыдущее...

На 100% не поручусь, но что-то подобное на 4.0 я делал....
...
Рейтинг: 0 / 0
23.12.2005, 19:27:10
    #33455305
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
в том-то и дело, что не обгоняет, четвёртую строчку-то правильно выдал.
мускуль, кажется, официально заявил об отсутствии корректной подержки такого трюка. Поля, вычисляемые через переменные - это только для клиента.
------------------
- А как в Интеpнете pаботать? - Сначала нужно узнать, что вам нужно rtfm
...
Рейтинг: 0 / 0
25.12.2005, 21:55:38
    #33456455
Dinky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Выборка каждой n-ой строки
И вообще, простые решения обычно самые эффективные :)
Создать временную таблицу или массив - заполнить его в цикл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
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Выборка каждой n-ой строки / 12 сообщений из 12, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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