Задавайте вопросы, мы ответим
Вы не зашли.
есть таблица с 2-мя полями `id`, `time`
нужно сделать запрос, который покажет какие айдишники были дольше всех самыми многочисленными....
вторую неделю голову ломаю как сделать в sql без реализации в php...
Неактивен
Уточните какая инфа хранится в таблице. Что хранится в поле `time` - время, когда произошло подключение или длительность сессии, или что-то ещё?
Для каждого id одна запись в таблице или много?
Каков алгоритм реализации предполагается Вами в php?
Неактивен
да, что-то я многое не пояснил...
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 запросом, если такое возможно конечно....?
Неактивен
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, а получите только конечный результат. Это положительно скажется на производительности.
Неактивен
Спасибо Большое!! то что нужно
кстати я доделал запрос и теперь задача реализуется только средствами mysql.
сделал соединение с изначальной таблицей, добавил поле MAX(time)-MIN(time) long ну и группировку в конце по айдишнику. Поле long как раз показывает время "лидерства"
еще раз Вам спасибо
Неактивен