2012-04-30 5 views
2

У меня есть база данных, полный PHP time(); хранящихся при входе пользователя в системе.Расчет макс логинов на каждый день

Я знаю, что я должен был создать значение для имени пользователя и обновлять счетчик входа в системе, но вместо этого у меня есть база данных полный PHP time(); с их username

Вот как я считаю количество логинов для отдельных пользователей:

<?php 
function to_date($timestamp) { 
    return date('Y-m-d', $timestamp); 
} 
$days = array(); 
$occurences = array(); 
$zero = array(); 
$query = mysql_query("SELECT `login_time` FROM `stats` WHERE `userid`='$someuserid' ORDER BY `login_time` ASC"); 
while($rows = mysql_fetch_array($query)) { 
    $days[] = to_date($rows['login_time']); 
} 
$days[] = to_date(time()); 
$occurences = array_count_values($days); 
$days = array_unique($days); 
sort($days); 
for($i = 0; $i < count($days); $i++) { 
    $difference = isset($days[$i+1]) ? strtotime($days[$i+1]) - strtotime($days[$i]) : 0; 
    if($difference > 86400) { 
     $difference = ceil(abs($difference/86400)); 
     $fill = $days[$i]; 
     for($k = 0; $k < $difference-1; $k++) { 
     $fill += strtotime('+1 day', strtotime($fill)); 
      $zero[] = to_date($fill); 
     } 
    } 
} 
echo "["; 
for($i = 0; $i < count($zero); $i++) { 
    echo "[\"".$zero[$i]."\",0], "; 
} 
for($i = 0; $i < count($occurences); $i++) { 
    if($i == count($occurences)-1) 
     echo "[\"".$days[$i]."\",".($occurences[$days[$i]]-1)."]"; 
    else { 
     echo "[\"".$days[$i]."\",".$occurences[$days[$i]]."], "; 
    } 
} 
echo "]"; 
?> 

Как я мог применить это ко всем пользователям и узнать, кто вошел в наиболее для каждый день в базе данных? Выход кодируется для jqplot.

ответ

2
SELECT 
    userid, 
    DATE(FROM_UNIXTIME(login_time-MOD(login_time,86400)+1)) as logindate, 
    count(*) as logincount 
FROM stats 
GROUP BY userid, logindate 

Используйте выше запрос, чтобы получить все необходимые данные непосредственно из базы данных, и это поможет вам избежать делать пост обработка с помощью PHP

Кроме того, если вы хотели бы получить только одну запись, которые имеют максимальные логины в (любой) день, использование ниже запрос с добавлением SQL оберткой для вышеупомянутого запроса:

SELECT * FROM (
    SELECT 
     userid, 
     DATE(FROM_UNIXTIME(login_time-MOD(login_time,86400)+1)) as logindate, 
     count(*) as logincount 
    FROM stats 
    GROUP BY userid, logindate 
) tmptable 
ORDER BY logincount DESC, logindate DESC LIMIT 1 

Сообщите мне, если это вам поможет.

+1

Ничего себе. Это так впечатляет. Большое вам спасибо, что я никогда не знал, что mysql может это сделать. Спасибо!! Ты спас меня так много времени! – user521903

0

ВЫБРАТЬ userid, COUNT (идентификатор) AS «login_count» FROM stats GROUP BY userid

0

Весь ответ может быть правильным или неправильным. Но я знаю одно, что мой ответ неверен. Но в случае Max logins нет необходимости в таком ответе. Это все, что я знаю.