SQLinfo.ru - Все о MySQL

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

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

Вы не зашли.

#1 29.03.2011 18:41:03

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Помогите составить sql запрос

Есть таблица поля  в поле number числа от 1 до 16


id number  time
1   5
2   3
3   3
4   2
5   2
6   7
7   8
...


нужно составить запрос так чтоб он выводил по 5 последних записей для каждого числа

результат должен быть такой

number
1
1
1
1
1
2
2
2
2
2
...
и так для каждого числа)

Заранее спасибо)

Неактивен

 

#2 29.03.2011 18:45:17

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

Re: Помогите составить sql запрос

Неактивен

 

#3 30.03.2011 12:28:58

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Спасибо за ссылки очень интересная информация но вот не могу додуматься как это все проделать с одной таблицей( чтоб она выводила по 3 последние записи для каждого числа) может что то подскажите)

Неактивен

 

#4 30.03.2011 16:01:48

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

У меня вопросик переписал запрос под себя и не могу разобраться почему по числу 0 он группирует 3 записи а по остальным по 4 ?
Запрос :

set @n=3, @i=0, @p=0;
select * from baza t1
join number t2 on t1.number=t2.number
where @i<=@n and if(@p=t1.number, @i:=@i+1,(@i:=0) or (@p:=t1.number));

Неактивен

 

#5 30.03.2011 17:35:38

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

Re: Помогите составить sql запрос

Что я не понял, что означают таблицы baza и number, когда в исходном сообщении только одна таблица.

select t1.* from
(select * from a order by number,`time`)t1,
(select @n:=3,@i:=0,@p:=0) x
where if(@p=t1.number, @i:=@i+1,(@i:=0) or (@p:=t1.number)) and @i<@n;


И вы таки невнимательно прочитали данные ссылки wink
http://sqlinfo.ru/forum/viewtopic.php?pid=20267#p20267

Неактивен

 

#6 30.03.2011 17:53:04

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Я все прочитал и сделал еще одну табличку number c числами 01234...для теста как это все работает так как только учусь)  но ваш запрос который вы написали выдает не правильные данные число 0 оно группирует только 2 раза а (должно 3 записи) а все остальные по 3 в этом я не могу разобраться (

Неактивен

 

#7 30.03.2011 22:47:44

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

Re: Помогите составить sql запрос

Вообще должно работать.

CREATE TABLE `t2` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `number` int(11) NOT NULL,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

insert into `t2`(number,time) values
 (4,'2011-04-04 00:44:41')
,(1,'2011-01-01 00:11:11')
,(2,'2011-02-02 00:22:21')
,(3,'2011-03-03 00:33:31')
,(5,'2011-05-05 00:55:51')
,(1,'2011-01-01 00:11:12')
,(5,'2011-05-05 00:55:52')
,(3,'2011-03-03 00:33:32')
,(4,'2011-04-04 00:44:42')
,(2,'2011-02-02 00:22:22')
,(3,'2011-03-03 00:33:33')
,(2,'2011-02-02 00:22:23')
,(1,'2011-01-01 00:11:13')
,(5,'2011-05-05 00:55:53')
,(4,'2011-04-04 00:44:43')
,(5,'2011-05-05 00:55:54')
,(3,'2011-03-03 00:33:34')
,(4,'2011-04-04 00:44:44')
,(2,'2011-02-02 00:22:24')
,(1,'2011-01-01 00:11:14')
,(2,'2011-02-02 00:22:25')
,(4,'2011-04-04 00:44:45')
,(5,'2011-05-05 00:55:55')
,(1,'2011-01-01 00:11:15')
,(3,'2011-03-03 00:33:35');


mysql>
select t2.* from (select * from t2 order by number,`time`)t2, (select @n:=3,@i:=0,@p:=0) x where if(@p=t2.number, @i:=@i+1,(@i:=0) or (@p:=t2.number)) and @i<@n;

+----+--------+---------------------+
| id | number | time                |
+----+--------+---------------------+
|  2 |      1 | 2011-01-01 00:11:11 |
|  6 |      1 | 2011-01-01 00:11:12 |
| 13 |      1 | 2011-01-01 00:11:13 |
|  3 |      2 | 2011-02-02 00:22:21 |
| 10 |      2 | 2011-02-02 00:22:22 |
| 12 |      2 | 2011-02-02 00:22:23 |
|  4 |      3 | 2011-03-03 00:33:31 |
|  8 |      3 | 2011-03-03 00:33:32 |
| 11 |      3 | 2011-03-03 00:33:33 |
|  1 |      4 | 2011-04-04 00:44:41 |
|  9 |      4 | 2011-04-04 00:44:42 |
| 15 |      4 | 2011-04-04 00:44:43 |
|  5 |      5 | 2011-05-05 00:55:51 |
|  7 |      5 | 2011-05-05 00:55:52 |
| 14 |      5 | 2011-05-05 00:55:53 |
+----+--------+---------------------+
15 rows in set (0.00 sec)

Результат вполне соответствует.

Тот же запрос несколько в другой форме:

mysql>
set @n=3, @i=0, @num=0; select * from (select * from t2 order by number) t2 WHERE if (@num=number, @i:=@i+1,(@i:=0) or (@num:=number)) and @i<@n;

Query OK, 0 rows affected (0.00 sec)

+----+--------+---------------------+
| id | number | time                |
+----+--------+---------------------+
| 13 |      1 | 2011-01-01 00:11:13 |
| 20 |      1 | 2011-01-01 00:11:14 |
|  6 |      1 | 2011-01-01 00:11:12 |
| 21 |      2 | 2011-02-02 00:22:25 |
|  3 |      2 | 2011-02-02 00:22:21 |
| 19 |      2 | 2011-02-02 00:22:24 |
| 17 |      3 | 2011-03-03 00:33:34 |
| 25 |      3 | 2011-03-03 00:33:35 |
| 11 |      3 | 2011-03-03 00:33:33 |
|  1 |      4 | 2011-04-04 00:44:41 |
|  9 |      4 | 2011-04-04 00:44:42 |
| 18 |      4 | 2011-04-04 00:44:44 |
| 14 |      5 | 2011-05-05 00:55:53 |
| 23 |      5 | 2011-05-05 00:55:55 |
|  5 |      5 | 2011-05-05 00:55:51 |
+----+--------+---------------------+
15 rows in set (0.00 sec)

Kochevnik написал:

Но ваш запрос который вы написали выдает не правильные данные число 0 оно группирует только 2 раза а (должно 3 записи) а все остальные по 3 в этом я не могу разобраться (

Приведите данные, на которых запрос не работает в том виде, в котором я привёл - посмотрим, почему не работает smile.


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

Неактивен

 

#8 30.03.2011 22:57:43

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Я ведь написал не хочет группировать число  "0" я просто случайные числа писал в условии)

Неактивен

 

#9 30.03.2011 23:39:30

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

Re: Помогите составить sql запрос

Да, есть такое, потому что @num=number возвращает ноль в случае, если number=0 sad. Лёгкая модификация СОРД:

set @n=3, @i=0, @num=-1; select * from (select * from t2 order by number) t2 WHERE if (@num=number, @i:=@i+1,((@i:=0) or (@num:=number)) or (1)) and @i<@n;


Но опять же, number по идее и отрицательные значения может принимать..


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

Неактивен

 

#10 30.03.2011 23:44:32

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

у меня в таблице не будет минусовых чисел)

Неактивен

 

#11 30.03.2011 23:46:58

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

Re: Помогите составить sql запрос

Ну тогда последнея модификация  должна работать.


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

Неактивен

 

#12 30.03.2011 23:52:10

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Спасибо сам бы долго искал причину) кажется все отображается завтра проверю на своей таблице)))

Неактивен

 

#13 31.03.2011 11:23:51

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

А можно ли сделать в таком виде если в предыдущий пример добавить еще один столбец count...
Пример
id   number count
1.       1        23
2.       3        45
3.       1        45
4.       5        83
5.       1        78
6.       4         2
7.       4         0
8.       3         36
9.       2         12
10.     2         14
...
как переделать под такой запрос я в курсе)
Условия такие как в первом примере но результат должен быть в чуток другом виде)

Результат:
number   count
1            23:45:78
2            12:14: ...
3            45:36: ...
....
Или в таком виде:
number  | 1 |   2  | 3|
1            23   45  78
....
возможна ли так сделать)
или лучше перебирать в цикле средствами php  первый пример?
Вот такая на мой взгляд непростая задачка (
Если возможно дать ссылки на информацию чтоб во всем разобраться и дать совет) Спасибо)

Неактивен

 

#14 31.03.2011 12:00:52

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

Re: Помогите составить sql запрос

Kochevnik написал:

Результат:
number   count
1            23:45:78
2            12:14: ...
3            45:36: ...

http://dev.mysql.com/doc/refman/5.5/en/ … oup-concat

Неактивен

 

#15 31.03.2011 14:44:26

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Написал запрос  запрос работает) вот только правильно его написал с точки синтаксиса?

select t2.number, GROUP_CONCAT(`notfalls`)as count
from (select * from baza order by number, `id` desc)t2,
(select @n:=3,@i:=0,@num:=-1) x
where if(@num=t2.number, @i:=@i+1,((@i:=0) or (@num:=t2.number)) or (1)) and @i<@n
GROUP by t2.number

Неактивен

 

#16 31.03.2011 14:49:49

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

vasya написал:

Kochevnik написал:

Результат:
number   count
1            23:45:78
2            12:14: ...
3            45:36: ...

http://dev.mysql.com/doc/refman/5.5/en/ … oup-concat

Спасибо помог только пришлось искать русское описание )
И еще вопросик у меня тип данных tinyint прочитал в статье что числа в этой функции нужно конвертировать в текст)
Как надо поступать?

Неактивен

 

#17 31.03.2011 15:04:49

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

Re: Помогите составить sql запрос

Kochevnik написал:

Написал запрос  запрос работает) вот только правильно его написал с точки синтаксиса?

Если бы вы его неправильно написали с точки зрения синтаксиса, то он бы не работал smile

Kochevnik написал:

Спасибо помог только пришлось искать русское описание )
И еще вопросик у меня тип данных tinyint прочитал в статье что числа в этой функции нужно конвертировать в текст)
Как надо поступать?

В документации я такого не вижу smile

Неактивен

 

#18 31.03.2011 15:30:24

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Спасибо еще раз но вот еще один камень появился этой функции еще явно нужно показывать в каком сортировать а то я посмотрел что она разбросала мои данные как попало?

Неактивен

 

#19 31.03.2011 16:03:26

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

Re: Помогите составить sql запрос

Да.

Неактивен

 

#20 31.03.2011 17:54:16

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Есть еще одна задачка не знаю можно ли реализовать в mysql
Условия та же самая табличка с числами)

+----+--------+---------------------+
| id | number |        count                |
+----+--------+---------------------+
|  13 |      1 | 33 |
|  6 |      1 | 44|
| 12 |      1 | 55 |
|  2 |      2 | 21 |
| 10 |      2 | 33 |
| 11 |      2 | 11 |
| 14 |      3 | 32 |
|  9 |      3 | 25 |
|  3 |      3 | 14 |
|  1 |      4 | 18 |
|  4 |      4 | 32 |
|  8 |      4 | 21 |
| 15 |      5 | 32 |
|  5 |      5 | 45 |
|  7 |      5 | 25 |
+----+--------+---------------------+
а мне нужен результат который будет выводить числа и count которые стоят до и после числа (нужны данные по последним 3 числам каждого числа )
number   |    1                          |  2               |  3            |
1           | 5 : 45: 5: 25              |   2 :11: 1:33 |  1:55:3:32|
               ч.д.n:c.д.ч:ч.п.n:c.п.n
           
....
обозначения:
ч.д.n - число до number id-1
с.д.n - count до number id-1
ч.п.n - число после number id+1
c.п.n - count после  number id+1
и так для всех чисел (числа от 0 до 37)
Возможно ли составить такой запрос ? Помогите с запросом если это возможно) или альтернативное решение)

Неактивен

 

#21 31.03.2011 19:36:52

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

Re: Помогите составить sql запрос

Что-то смысл задачи от меня ускользает sad

Неактивен

 

#22 31.03.2011 19:44:33

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Попробую объяснить

есть группа чисел от 0 до 37
например число 1 перед ним стоит 4 после 7 надо вывести 1  -  4 и 7

нужно вывести для каждого числа числа которые идут до и после этого числа числа )  нужно вывести для 3 последних чисел так понятней?

Неактивен

 

#23 31.03.2011 21:23:13

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

Re: Помогите составить sql запрос

Kochevnik написал:

есть группа чисел от 0 до 37
например число 1 перед ним стоит 4 после 7 надо вывести 1  -  4 и 7

В исходной таблице есть 3 строчки где number =1

|  13 |      1 | 33 |
|  6 |      1 | 44|
| 12 |      1 | 55 |


Откуда берутся 4 и 7?

Неактивен

 

#24 31.03.2011 22:42:58

Kochevnik
Участник
Зарегистрирован: 29.03.2011
Сообщений: 18

Re: Помогите составить sql запрос

Я просто пример привел не по таблице сейчас приведу по таблице)

Число 1  у него id=13 нам надо числа до это число и count  с 
id=12  (number=1 count=55) и после  число с id=14( number=3 count=32)
Следующее число 1 но у него id=12 c этого следует
что нам нужны числа и count с id=11 и id=13;
Следующее число 1 но у него id=6 c этого следует
что нам нужны числа и count с id=5 и id=7;
переходим к следующему числу 2)......
Может так лучше будет)

Неактивен

 

#25 31.03.2011 23:36:34

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

Re: Помогите составить sql запрос

С помощью подзапросов:

select t1.*, (select concat(number,':',count from `таблица` t2 where t2.id=t1.id-1)) from `таблица` t1;

Неактивен

 

Board footer

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