выборка максимального числа записей с разными значениями

wanderer

PHP - rulez!...
выборка максимального числа записей с разными значениями

вот ещё одна проблемка:

мне нужно получить день когда было максимальное число поситителей на сайте (тоесть поситителей с разными ип-адрессами), и их кол-во. вот что я накалякал:
[sql]SELECT COUNT(user_ip) AS user_ip_count FROM site_stat GROUP BY FROM_UNIXTIME(user_time, '%Y/%m/%d'), user_ip ORDER BY user_ip_count DESC LIMIT 1[/sql]
но я получаю только кол-во хитов, тоесть максимальное кол-во записей за какой-то день. я не могу понять почему не группируются записи по user_ip, а только по дате.
 

alpes

Весь мир на ладони
Все правильно оно должно тебе отдавать!
[sql]
SELECT FROM_UNIXTIME( user_time, '%Y/%m/%d' ) as inday,
COUNT(user_ip) AS user_ip_count
FROM site_stat
GROUP BY inday, user_ip
ORDER BY user_ip_count DESC
LIMIT 1
[/sql]
 

wanderer

PHP - rulez!...
не знаю почему, но не работает. верней он работает, но для MySQL он идинтичен запросу без группировки по user_ip:
[sql]SELECT COUNT(user_ip) AS user_ip_count FROM site_stat GROUP BY FROM_UNIXTIME(user_time, '%Y/%m/%d') ORDER BY user_ip_count DESC LIMIT 1[/sql]
 

Апельсин

Оранжевое создание
посмотри на значения в таблице, вполне возможно что вывод будет совпадать. выведи эти поля, что бы посмотреть их значения.
 

wanderer

PHP - rulez!...
я что-то не понял, что ты хотела сказать. если ты имела ввиду, что результаты могут просто совпадать, то нет.
[sql]SELECT COUNT( user_ip ) AS user_ip_count
FROM site_stat
GROUP BY FROM_UNIXTIME( user_time, '%Y/%m/%d' )
ORDER BY user_ip_count DESC
LIMIT 1 [/sql]
по этому запросу, как и по запросу
[sql]SELECT FROM_UNIXTIME(user_time, '%Y/%m/%d') AS inday, COUNT(user_ip) AS user_ip_count FROM site_stat GROUP BY inday, user_ip ORDER BY user_ip_count DESC LIMIT 1[/sql]
я получаю число 66 и дату 2003/06/21:
Код:
Array
(
    [inday] => 2003/06/21
    [user_ip_count] => 66
)
по второму же запросу я должен получить число 4 и дату 2003/06/23.

так как я сделал запрос:
[sql]SELECT COUNT(user_ip) AS user_ip_count, FROM_UNIXTIME(user_time, '%Y/%m/%d') AS user_date FROM site_stat GROUP BY user_date, user_ip ORDER BY user_date, user_ip[/sql]
я получил:
Код:
Array
(
    [user_ip_count] => 66
    [user_date] => 2003/06/21
)
Array
(
    [user_ip_count] => 3
    [user_date] => 2003/06/23
)
Array
(
    [user_ip_count] => 1
    [user_date] => 2003/06/23
)
Array
(
    [user_ip_count] => 44
    [user_date] => 2003/06/23
)
Array
(
    [user_ip_count] => 1
    [user_date] => 2003/06/23
)
Array
(
    [user_ip_count] => 3
    [user_date] => 2003/06/24
)
Array
(
    [user_ip_count] => 1
    [user_date] => 2003/06/26
)
не трудно посчитать, что на число 23 приходится 4 записи.
 

alpes

Весь мир на ладони
А... понял, этот запрос, что ты написал, работает правильно, тока с той разницей в определении, что он выдает день в который было максимальное количество заходов с оного и тогоже IP. Для получения уникумов надо по другому, что-то типа такого:
PHP:
CREATE TEMPORARY TABLE countIPday TYPE=HEAP
SELECT FROM_UNIXTIME(user_time, '%Y/%m/%d' ) AS inday, user_ip
FROM site_stat
GROUP BY inday, user_ip

SELECT COUNT(user_ip) as count_day_in
FROM countIPday GROUP BY inday
ORDER BY count_day_in DESC
LIMIT 1
 

wanderer

PHP - rulez!...
что0то я не понял как данные попадают в темлори таблицу, но всё равно спасибо, попробую!
 

wanderer

PHP - rulez!...
народ. помогите мне решить этот вопрос. я не знаю как составить такой запрос. пример alpes'а не работает. может у меня просто корявые руки.
 

alpes

Весь мир на ладони
Вообще не работает, или выдает не то что нужно??!
>я не знаю как составить такой запрос
Или ты пытаешься все в однин запрос всунуть?! Так там их два ;)
 

wanderer

PHP - rulez!...
я вообще в три разбил :) щас попробую ещё раз в два запроса.
вообщем выход нашёл, вот так:
PHP:
$result = sql_query("SELECT COUNT(user_ip) AS user_ip_count, FROM_UNIXTIME(user_time, '%Y/%m/%d') AS user_date FROM site_stat GROUP BY user_date, user_ip ORDER BY user_date, user_ip");
while ($tmp_row = mysql_fetch_assoc($result)) {
  $all_hosts_list_count[$tmp_row["user_date"]]++;
}
$GLOBALS["max_hosts"] = 0;
foreach ($all_hosts_list_count as $tmp_date => $tmp_count) {
  if ($tmp_count > $GLOBALS["max_hosts"]) {
    $GLOBALS["max_hosts"] = $tmp_count;
  }
}
но хочется всё же через sql запрос
 
Сверху