2009-06-08 5 views
4

У меня есть таблица, содержащая данные на страницеhit (нормализованные), и мне нужно захватить 10 последних уникальных ips.Как получить 10 последних IP-адресов DISTINCT из таблицы MySQL?

Я попытался сделать это следующим образом:

SELECT * FROM spy_hits ORDER BY date desc GROUP BY ip LIMIT 10; 

Который должен дать мне этот результат:

 
+-----+------------+-----+---------+----+------+------+---------+-------+-------+ 
| id | date  | ip | browser | os | page | host | referer | query | agent | 
+-----+------------+-----+---------+----+------+------+---------+-------+-------+ 
| 354 | 1244442065 | 2 |  3 | 2 | 16 | 1 |  47 | 12 |  2 | 
| 311 | 1244442000 | 1 |  2 | 1 | 16 | 1 |  36 | 12 |  1 | 
+-----+------------+-----+---------+----+------+------+---------+-------+-------+ 
2 rows in set (0.00 sec) 

Это последние уникальных посетителей сайта.

Но вместо этого результата получается синтаксическая ошибка.

Так что я должен сделать этот запрос:

SELECT * FROM spy_hits GROUP BY ip ORDER BY date desc LIMIT 10; 

который я думал, было бы хорошо. Но это дает этот результат:

 
+-----+------------+-----+---------+----+------+------+---------+-------+-------+ 
| id | date  | ip | browser | os | page | host | referer | query | agent | 
+-----+------------+-----+---------+----+------+------+---------+-------+-------+ 
| 280 | 1242130841 | 2 |  3 | 2 | 16 | 1 |  47 | 12 |  2 | 
| 268 | 1242130818 | 1 |  2 | 1 | 16 | 1 |  36 | 12 |  1 | 
+-----+------------+-----+---------+----+------+------+---------+-------+-------+ 
2 rows in set (0.00 sec) 

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

Так таблица идет:

 
id --- date 
268 1242130818 (Old) 
    |  | 
    V  V 
354 1244442065 (New) 

Но я хочу, чтобы идти, как это раньше, чем я группа по:

 
id --- date 
354 1244442065 (New) 
^ ^
    |  | 
268 1242130818 (Old) 

Я использую PHP с ним, так что если кто-нибудь имеет представление о том, как получить результаты с помощью PHP-решения.

Приветствия заранее :)

+0

+1 для твердого вопроса из относительно нового пользователя. Если бы все вопросы в StackOverflow были такими, мир был бы лучшим местом. –

+0

+1 по той же причине вышеприведенного комментария. Так держать! :) – kizzx2

ответ

3

Если у вас есть несколько DISTINCT IP 'S:

SELECT ip, MAX(date) AS maxdate 
FROM (
     SELECT ip, MAX(date) AS maxdate 
     FROM spy_hits 
     GROUP BY 
       ip 
     ) 
ORDER BY 
     maxdate DESC 
LIMIT 10 

Если у вас есть много DISTINCT IP' с:

SELECT * 
FROM spy_hits so 
WHERE NOT EXISTS 
     (
     SELECT 1 
     FROM spy_hits si 
     WHERE si.ip = so.ip 
       AND si.date > so.date 
     ) 
ORDER BY 
     date DESC 
LIMIT 10 

Создание двух индексов этой таблицы :

CREATE INDEX ix_spyhits_date ON spy_hits (date) 
CREATE INDEX ix_spyhits_ip_date ON spy_hits (ip, date) 

улучшит эти запросы.

Посмотреть эту запись в моем блоге подробности производительности:

+0

Ничего себе, спасибо! Это работает отлично! :) – hamstar