SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

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

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

Вы не зашли.

#1 27.02.2008 18:51:18

Innuendo
Участник
Зарегистрирован: 27.02.2008
Сообщений: 5

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

есть таблица с 2-мя полями `id`, `time`
нужно сделать запрос, который покажет какие айдишники были дольше всех самыми многочисленными....
вторую неделю голову ломаю как сделать в sql без реализации в php...

Неактивен

 

#2 27.02.2008 19:07:32

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

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

Уточните какая инфа хранится в таблице. Что хранится в поле `time` - время, когда произошло подключение или длительность сессии, или что-то ещё?
Для каждого id одна запись в таблице или много?

Каков алгоритм реализации предполагается Вами в php?

Неактивен

 

#3 27.02.2008 20:21:37

Innuendo
Участник
Зарегистрирован: 27.02.2008
Сообщений: 5

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

да, что-то я многое не пояснил...
time - "текущее" время заноса в базу (в секундах)
ключегого и уникальных полей нет. много повторяющихся id. айдишник просто в дальнейшем нужен для другой таблицы
мой php алгоритм - делаю запрос
SELECT `time` FROM `table` ORDER BY `time`        (1)

в цикле, с каждым элементом получаемого массива ($mas['0']) делаю запрос

SELECT `id`, COUNT( `id` ) AS `num` FROM `table` WHERE `time`<='".$mas['0']."' GROUP BY `id` ORDER BY `num` DESC LIMIT 0,1              (2)

т.е. получаю самую многочисленную запись на момент времени $mas['0']. далее, на словах, проверяю получен ли тот же айдишник, что и в предыдущем запросе, если да, то обновляю время его "лидерства", если нет, то обнуляю время соответственно.
как понимаете, такой вариант меня не очень устраивает по длительности его работы. программа делает столько запросов, сколько записей в таблице (1). не могли бы Вы подсказать как реализовать задачу одним sql запросом, если такое возможно конечно....?

Неактивен

 

#4 28.02.2008 12:29:30

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

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

Innuendo написал:

т.е. получаю самую многочисленную запись на момент времени $mas['0']. далее, на словах, проверяю получен ли тот же айдишник, что и в предыдущем запросе, если да, то обновляю время его "лидерства", если нет, то обнуляю время соответственно.

Что-то я не понял, почему обнуляется время "лидерства".

Одним запросом Вы можете получить таблицу, где для каждого `time` будет указан наиболее многочисленный на данный момент `id`.
SELECT `time`,id FROM (SELECT t1.`time`,t2.id,count(t2.id) c FROM (SELECT * FROM tb_name t3) t1 LEFT JOIN tb_name t2 ON t1.`time`>=t2.`time` GROUP BY t1.`time`,t2.id ORDER BY c DESC) tb GROUP BY `time`;

Далее нужно пройтись по этой таблице и для каждого id из предыдущей записи увеличить время лидерства на разницу в `time` между двумя записями. Изначально у всех время лидерства 0. В результате Вы получите время лидерства для каждого id.
Или я не правильно понял смысл поставленной задачи?

Делать это всё лучше в хранимой процедуре (нужен MySQL5.0 и выше), тогда Вам не придется перекачивать данные в php, а получите только конечный результат. Это положительно скажется на производительности.

Неактивен

 

#5 28.02.2008 18:58:38

Innuendo
Участник
Зарегистрирован: 27.02.2008
Сообщений: 5

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

Спасибо Большое!! то что нужно
кстати я доделал запрос и теперь задача реализуется только средствами mysql.
сделал соединение с изначальной таблицей, добавил поле MAX(time)-MIN(time) long ну и группировку в конце по айдишнику. Поле long как раз показывает время "лидерства"
еще раз Вам спасибоsmile

Неактивен

 

Board footer

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