SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 08.09.2009 02:41:23

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Как составить такой запрос

Мне необходимо выбрать по 5ть наиболее свежих строк для каждого из значений поля type. Как это лучше всего сделать? С помощью SQL выражения или же написать процедуру? Для меня предпочтительнее использовать первый вариант.

Для оптимизации колличества запросов разумеется, д.б. всего один запрос.

Буду признателен, если поможете составить такого рода выражение!

Касательно СУБД - использую MySQL 5.1.36.

Отредактированно Siegfrid (08.09.2009 02:44:09)

Неактивен

 

#2 08.09.2009 02:53:24

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Как составить такой запрос

похоже ответ на мой же вопрос - использование выражения UNION. Я правильно понимаю, что физически один запрос будет состоять из нескольких подзапросов, объединеных ключевым словом UNION?

Неактивен

 

#3 08.09.2009 06:43:44

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Как составить такой запрос


set @n=5, @i=0, @t='';

select * from (select * from имя_таблицы order by type asc, колонка_с_датой desc) where @i<@n and if(@t=type,@i:=@i+1,(@i:=0) or (@t:=type));

Неактивен

 

#4 08.09.2009 07:10:30

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Как составить такой запрос

Столкнулся со следующей проблемой.


test >create table test (a varchar(255));
Query OK, 0 rows affected (0.45 sec)

test >insert into test values('one'),('one'),('one'),('two'),('three');
Query OK, 5 rows affected (0.42 sec)
Records: 5  Duplicates: 0  Warnings: 0

test >set @i:=0,@t:='';
Query OK, 0 rows affected (0.00 sec)

test >select a, @t, @i, if(@t=a,@i:=@i+1,@t:=a) from test;
+-------+------+------+-------------------------+
| a     | @t   | @i   | if(@t=a,@i:=@i+1,@t:=a) |
+-------+------+------+-------------------------+
| one   |      |    0 | one                     |
| one   | one  |    0 | one                     |
| one   | one  |    0 | one                     |
| two   | one  |    0 | two                     |
| three | two  |    0 | three                   |
+-------+------+------+-------------------------+
5 rows in set (0.00 sec)


Мы видим, что в первой строке переменной @t присваивается значение поля a. Однако в последующих строках считается, что условие @t=a не выполняется.

Если же первоначальное значение переменной @t сделать равным 'one', то


test >set @i:=0,@t:='one';
Query OK, 0 rows affected (0.00 sec)

test >select a, @t, @i, if(@t=a,@i:=@i+1,@t:=a) from test;
+-------+------+------+-------------------------+
| a     | @t   | @i   | if(@t=a,@i:=@i+1,@t:=a) |
+-------+------+------+-------------------------+
| one   | one  |    0 | 1                       |
| one   | one  |    1 | 2                       |
| one   | one  |    2 | 3                       |
| two   | one  |    3 | two                     |
| three | two  |    3 | three                   |
+-------+------+------+-------------------------+
5 rows in set (0.02 sec)

Получается, что в условии @t=a всегда используется первоначальное значение переменной @t.

Не пойму в чем прикол. Или это я счастливый обладатель версии 5.1.21-beta-community-log ?

Неактивен

 

#5 08.09.2009 13:03:18

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Как составить такой запрос

vasya написал:


set @n=5, @i=0, @t='';

select * from (select * from имя_таблицы order by type asc, колонка_с_датой desc) where @i<@n and if(@t=type,@i:=@i+1,(@i:=0) or (@t:=type));

спасибо, за совет, а вот вопрос касательно вызова процедур, можно ли в MySQL в качестве параметра передавать процедуре массив данных, если да, то можно какой нить примерчик простенький?

Касательно массива - он может содержать произвольное количество значений - поддерживает ли MySQL динамическое создание таких параметров?

Неактивен

 

#6 08.09.2009 14:39:18

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Как составить такой запрос

Вась, возможно это таки версия MySQL:

[aquatica] root test > set @i:=0,@t:='';
Query OK, 0 rows affected (0.00 sec)

[aquatica] root test > select a, @t, @i, IF(@t=a,@i:=@i+1,@t:=a) FROM test;
+-------+------+------+-------------------------+
| a     | @t   | @i   | IF(@t=a,@i:=@i+1,@t:=a) |
+-------+------+------+-------------------------+
| one   |      |    0 | one                     |
| one   | one  |    0 | 1                       |
| one   | one  |    1 | 2                       |
| two   | one  |    2 | two                     |
| three | two  |    2 | three                   |
+-------+------+------+-------------------------+
5 rows in set (0.02 sec)

[aquatica] root test > set @i:=0,@t:='one';
Query OK, 0 rows affected (0.00 sec)

[aquatica] root test > select a, @t, @i, IF(@t=a,@i:=@i+1,@t:=a) FROM test;
+-------+------+------+-------------------------+
| a     | @t   | @i   | IF(@t=a,@i:=@i+1,@t:=a) |
+-------+------+------+-------------------------+
| one   | one  |    0 | 1                       |
| one   | one  |    1 | 2                       |
| one   | one  |    2 | 3                       |
| two   | one  |    3 | two                     |
| three | two  |    3 | three                   |
+-------+------+------+-------------------------+
5 rows in set (0.00 sec)

[aquatica] root test > \s
--------------
mysql  Ver 14.14 Distrib 5.1.34, for debian-linux-gnu (i486) using readline 5.2

Неактивен

 

#7 08.09.2009 15:56:53

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Как составить такой запрос

Уважаемые модераторы а как на счет моего вопроса?

Неактивен

 

#8 08.09.2009 17:08:52

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6756

Re: Как составить такой запрос

Понятия «массив» в MySQL нет. Самое близкое, что можно предложить, — временная табличка,
которая будет использоваться хранимой процедурой.

Неактивен

 

#9 08.09.2009 17:25:43

Siegfrid
Участник
Зарегистрирован: 08.09.2009
Сообщений: 21

Re: Как составить такой запрос

Спасибо! Видимо придется использовать все таки union выражение.

Неактивен

 

#10 08.09.2009 18:37:20

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5833

Re: Как составить такой запрос

Это вы о чем?

Неактивен

 

Board footer

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