|
группировка по идее чтобы он мне выдал пары{time_id, count} - на каждый промежуток свое число. Счетчик никак, данные приходят извне.
|
|
|
|
|
Цитата: "Argnist" от 05 Февраль, 2011, 11:02:35 Есть таблица VISIT:login varcharbegin intend intИ таблица TIMES:time_idstamp_b intstamp_e intА это чем плохо?) На всех полях стоят индексы.
|
|
|
|
|
time_idплан?)explain запросаid select_type table type possible_keys key key_len ref rows Extra1 SIMPLE times ALL stamp_b,stamp_e NULL NULL NULL 23040 Using temporary; Using filesort1 SIMPLE visit ALL begin,end NULL NULL NULL 226092 Range checked for each record (index map: 0x6)
|
|
|
|
|
Есть таблица VISIT:login varcharbegin intend intИ таблица TIMES:time_idstamp_b intstamp_e intНужно выбрать количество полей из таблицы VISIT, которые удовлетворяют условию:visit.begin < times.stamp_e and visit.end > times.stamp_bТо есть для каждого промежутка из TIMES найти количество попадающих в этот промежуток посещений из VISITЗапрос[sql]select `times`.`time_id` as `time`, count (`visit`.`login`) as `count` from `visit`, `times` where `visit`.`begin` < `times`.`stamp_e` and `visit`.`end` > `times`.`stamp_b`group by `times`.time[/sql]вешает сервер со всякими bad gatewayКак сделать правильно?
|
|
|
|
|
Цитата: "artoodetoo" от 09 Июль, 2010, 01:58:26 вот чтобы небыло тыщ, делай group by. а чтобы мозг твой не расплавился что именно группировать - группируй по одному полю времени (+ опционально по полю id)схематично - я использую тип INT для времени - для простоты:Код PHP$sql = "SELECT round(({$now}-v.visited)/{$interval}) AS ago, count(*) AS cntFROM `visits` AS vGROUP BY ago";мне таки кажется, что цель посчитать количество заходов за интервал, а не количество заходов по пользователям, поэтому здесь группировка только по усеченному временипривязка к visited плохо( получается не все интервалы выводит, а надо бы чтоб ноль выводил
|
|
|
|
|
Givi, как это сделать в PHP я не спрашивал, я спрашивал про MySql) согласись размер кода огромныйartoodetoo, пасиб, уже что-то ближе, сейчас подумаю
|
|
|
|
|
не за последние! а за $total = неделя, месяц год? и тд)) в этом и проблема, все работает, но тыщи отдельных запросов как-то не оч
|
|
|
|
|
1) да не важно 1 дата или нет, главное чтоб попадала в сгенерированные промежутки cur_b - cur_e, остальное я допилю как надо2) login в таблице не уникальный, Group by по логину не проходит, только с Distinct, тут не надо трогать) {+++204+++} Group by по логину вернет кол-во записей для каждого уникального логина для каждого промежутка времени, а мне надо кол-во уникальных логинов для каждого промежутка времени {+++23+++} поэтому Distinct =)
|
|
|
|
|
короче вот такое надо переделать в 1 запрос :)Код PHP...$yesterday = mktime($hour, 0, 0, $month, $day, $year) - 86400;$interval = 900; // 15 минутfor ($i = 0; $i <= $total; $i += $interval){ $cur_e = date("Y-m-d H:i:s", $yesterday - $i); $cur_b = date("Y-m-d H:i:s", $yesterday - $i - $interval); $res = mysql_query("SELECT COUNT(DISTINCT login) AS count FROM visits WHERE visit_begin <= '$cur_e' AND visit_end >= '$cur_b' ");...}
|
|
|
|
|
чет явно не то, не совпадает с кучей отдельных селектов)
|
|
|
|
|
не обязательно по часам, может быть и 15минутный промежуток) самое главное не знаю как сгенерировать это разбиение
|
|
|
|
|
Есть табличка:id int time datetime...уникальные пара (id, time)Можно ли одним SQL запросом подсчитать кол-во id для нескольких промежутков времени? Например, за последнюю неделю кол-во уникальных id для каждого часа?Выход:count(id)Y-m-d H1-H2342010-07-09 10-11462010-07-09 09-10112010-07-09 08-09и т.д.
|
|
|
|
|
вот, что я имел ввиду ^__^
|
|
|
|
|