2015-08-29 5 views
1

Моя таблица - это, в основном, журнал доступа, который записывает каждый хит страницы. То, что я хочу показать, - это количество просмотров страниц в неделю для каждой из недель года, сравнивая год за годом (так что у меня есть неделя 1 2013, 2014, 2015, неделя 2 2013, 2014 и т. Д.). Я в настоящее время достижения этого, просто запрашивая все записи, и позволяя PHP делать тяжелую работу следующим образом:Количество записей, сгруппированных по неделям года

$result=$db->query("select `time` from accessTracking where `uID` is not null and `time`>1357030861 order by `time`"); 
foreach($result as $r){ 
    $y=date("Y",$r['time']); 
    $w=ltrim(date("W",$r['time']),'0'); 
    $accessArray[$w][$y]++; 
} 

В то время как она работает, она занимает твердые 7 секунд, чтобы загрузить страницу она отображает график на и Я предполагаю, что есть не только лучший способ с PHP, но даже более того с MySQL (это то, что я ищу, но я возьму все, что уберет время загрузки страницы и сделает все это более эффективным.

Итак, с этим, лучшее, что я придумал это:

select weekofyear(`time`) as week, count(*) as count from `accessTracking` where `uID` is not null group by week 

Похоже, что он будет работать, поскольку он возвращает 53 строки с столбцом «неделя» от 1-52 и столбцом «count» со случайными значениями в них от 2 до 1100. Проблема в том, что цифры должны быть выше так как самая высокая неделя у меня составляет около 27 000 обращений, а первая запись, возвращаемая в этом запросе, является нулевым значением «неделя» со значением «count» около 398 000. Это говорит мне, что для большинства записей это не вычисляет значение weekofyear().

Я предполагаю, что в конце я буду считать это отдельными запросами на каждый год, так как может быть слишком много, чтобы вернуть год, номер недели и счет, все сгруппированы так, как я хочу. Но кто знает!

+0

Это не должно быть «слишком много», чтобы добавить дополнительную группировку в год, и я считаю, что вы делаете это правильно. Я не знаю достаточно о функции 'weekofyear()', чтобы рассуждать об этом. – shawnt00

+0

Фред, таблица не проиндексирована, но я не уверен, что здесь будет очень много полезной информации, мы на самом деле не ищем и не сортируем информацию. Каждая запись должна быть проанализирована, а затем отсортирована после этого. Пагинация действительно не является вариантом, так как окончательный набор результатов (для использования на странице, где отображаются данные) - это только количество записей за каждую неделю за каждый год, а не самих записей. Поэтому, если бы вы хотели отображать результаты за последние три полных года, у вас было бы всего 156 записей. Там не так много. – Patrick

+0

Я удалил свой комментарий об этом Патрике; Я так много думал и был удален, прежде чем вы отправили свой комментарий после. См. Ответы ниже. Однако индексирование поможет * немного *. Гордон гораздо более совершенен в SQL, чем я. –

ответ

2

Ваши запросы не сопоставимы. В частности, первый из них имеет это условие:

`time` > 1357030861 

Это говорит о том, что time это время Unix. Я хотел бы предложить вам попробовать:

select weekofyear(from_unixtime(`time`)) as week, count(*) as count 
from `accessTracking` 
where `uID` is not null and `time` > 1357030861 
group by week; 
+0

Так оно и было. Запрос работает и запускается менее чем за полсекунды. Он просто не передавал «weekofyear()» правильный тип ценности, который кажется. Да, «время» - это временная метка unix. Казалось бы, я мог бы даже реализовать его, возвращая год, а не слишком много дополнительного времени. Большое спасибо Гордон! – Patrick

0

Прежде всего, это не очень хорошая идея, чтобы использовать ключевые слова или функции, как ваши имена столбцов, так как это приводит к путанице и риск ошибок (и того, чтобы помнить все ` персонажи). Я думаю, что это будет делать то, что вы хотите, но с годом, добавленным к результатам.

select weekofyear(from_unixtime(`time`)) as wk, 
     year(from_unixtime(`time`)) as yr, 
     count(*) as ct 
from `accessTracking` 
where `uID` is not null 
group by wk, yr 

Для устранения непонятных результатов, которые вы видите, вы должны запросить конкретные записи и посмотреть, как они соответствуют совокупности. Например:

select `time` as access_time 
from `accessTracking` 
where `uID` is not null and 
     weekofyear(from_unixtime(`time`)) = 1 and 
     year(from_unixtime(`time`)) = 2015 

Сравните количество строк из этого запроса с тем, что вы получаете в сводном запросе. Они должны совпадать, и если они этого не сделают, вы можете лучше увидеть, где это несоответствие. Естественно, я бы предложил выбрать неделю с меньшим количеством строк для устранения неполадок или строк, которые показывают результаты, которые вы считаете неправильными.

+0

Я согласен с вопросом по ключевым словам. Не знаю, где мои хэшмарки вышли в этом запросе, но у меня была такая проблема на ранней стадии. Спасибо за напоминание, и вы были на том же пути, что и Гордон, с функцией from_unixtime(). Отлично. – Patrick

Смежные вопросы