Помогите написать интересный запрос :)

Статус: Offline
Реєстрація: 04.11.2006
Повідом.: 4172
Помогите написать интересный запрос :)

В общем есть:
1 таблица tree: id, title
2 таблица records: id, tree_id, date

Нужно посчитать количество записей и позицию дерева за определенный промежуток времени. Точнее сразу за 4 или более промежутка времени (день, неделя, месяц + динамическое кол-во кастомных интервалов).

Как определяется позиция дерева? Берутся все деревья и смотрится у кого сколько рекордов. На 1м месте дерево у которого больше всего записей.

И вообще как это правильнее всего сделать, чтоб было быстро? Как считать в PHP или все же в мускуле?
Масштабы примерно такие от 10к и больше деревьев, на каждое дерево до 20к записей :)
Спасибо :)
 
В общем есть:
1 таблица tree: id, title
2 таблица records: id, tree_id, date

Нужно посчитать количество записей и позицию дерева за определенный промежуток времени. Точнее сразу за 4 или более промежутка времени (день, неделя, месяц + динамическое кол-во кастомных интервалов).

Как определяется позиция дерева? Берутся все деревья и смотрится у кого сколько рекордов. На 1м месте дерево у которого больше всего записей.

И вообще как это правильнее всего сделать, чтоб было быстро? Как считать в PHP или все же в мускуле?
Масштабы примерно такие от 10к и больше деревьев, на каждое дерево до 20к записей :)
Спасибо :)

SELECT `tree_id`, COUNT(*) AS `count` FROM `records`
WHERE `date` BETWEEN '{$startDate}' AND '{$endDate}'
GROUP BY `tree_id`
ORDER BY `count` DESC

позицию получишь как порядковый номер результата.
для разных промежутков - подставляем разные $startDate и $endDate.

чтобы было "быстро" - индекс по полю tree_id и по полю date.
 
т.е. на каждый интервал делать отдельный запрос?
 
т.е. на каждый интервал делать отдельный запрос?

угу.
хотя можно и так:

SELECT 1 AS `interval`, `tree_id`, COUNT(*) AS `count` FROM `records`
WHERE `date` BETWEEN '{$startDate1}' AND '{$endDate1}'
GROUP BY `tree_id`
ORDER BY `count` DESC
UNION ALL
SELECT 2 AS `interval`, `tree_id`, COUNT(*) AS `count` FROM `records`
WHERE `date` BETWEEN '{$startDate2}' AND '{$endDate2}'
GROUP BY `tree_id`
ORDER BY `count` DESC
UNION ALL...

но этож извращенство. просто засунь запрос в функцию и вызывай сколько хочешь и как хочешь.
 
немного подумав понял что это не совсем то что нужно :)

мне нужна статистика по конкретному дереву. Вытаскивать всю пачку деревьев имхо не очень оптимизированно
 
немного подумав понял что это не совсем то что нужно :)

мне нужна статистика по конкретному дереву. Вытаскивать всю пачку деревьев имхо не очень оптимизированно

ото жеж ежик. ну прям как ирландский заказчик.. хоть бы спасибо сказал.
да хрен ты определишь позицию конкретного дерева, если не отсортируешь все.
оптимизировать - это к оршанскому.
 
Ну запрос можно написать примерно вот так. Тогда интересует вопрос что будет быстрее, такого рода запрос или работа с более чем 10к записей в php?
Код:
SELECT 
    `tree_id`,
     COUNT(*) AS `count`,
    `position`
FROM 
  (
    SELECT @pos:=0;
    SELECT
         `tree_id`,
         @pos:=@pos+1 AS `position`
         COUNT(*) AS `count`
    FROM `records`
    WHERE `date` BETWEEN '{$startDate2}' AND '{$endDate2}' 
    GROUP BY `tree_id`
    ORDER BY `count` DESC
   ) AS `records`
WHERE `tree_id` = '$id'
 
Ну запрос можно написать примерно вот так. Тогда интересует вопрос что будет быстрее, такого рода запрос или работа с более чем 10к записей в php?
ну вообще да.
такого рода запрос естесно будет быстрее.
SET @pos:=0; можно поставить в самое начало.

в принципе, если периоды времени фиксированные можно расчитывать количества один раз, например за каждую неделю, и сливать в другую табличечку.



Код:
SELECT 
    `tree_id`,
     COUNT(*) AS `count`,
    `position`
FROM 
...

ошибочко у Вас. надо так:
Код:
SELECT 
    `tree_id`,
    [B]`count`,[/B]
    `position`
FROM 
...
 
Останнє редагування:
Спасибо, но репка чото не лезет.
 
Назад
Зверху Знизу