2009-06-08 40 views
4

我有一個包含pagehit(標準化)數據的表格,我需要抓取10個最新的獨特ips。如何從MySQL表中檢索10個最新的DISTINCT IP?

我試圖做這樣的:

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中的所有問題都是這樣,那麼這個世界將會是一個更好的地方。 – 2009-06-08 09:18:53

+0

+1,原因與上述評論相同。保持! :) – kizzx2 2009-06-08 09:21:11

回答

3

如果你有幾個DISTINCT IP的:

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) 

會改善這些查詢很多。

請參見我的博客性能細節此項:一個堅實的問題,從一個相對較新的用戶