2009-06-08 8 views
4

Ich habe eine Tabelle mit page-hit (normalisierten) Daten und ich muss die 10 letzten eindeutigen ips greifen.Wie 10 letzte DISTINCT IPs aus einer MySQL-Tabelle abgerufen werden?

Ich habe versucht, es so zu tun:

 
+-----+------------+-----+---------+----+------+------+---------+-------+-------+ 
| 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) 

, dass die neueste einzigartige Besucher der Website ist:

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

Was mich dieses Ergebnis geben sollte.

Aber ich bekomme einen Syntaxfehler statt dieses Ergebnisses.

So habe ich diese Abfrage zu tun:

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

Was ich dachte, würde in Ordnung sein. Aber es gibt dieses Ergebnis:

 
+-----+------------+-----+---------+----+------+------+---------+-------+-------+ 
| 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) 

Aber das setzt nach Datum geordnet nach ihrem gruppierte bereits so packt er den ersten einzigartigen ips in der Tabelle, die auch die ältesten.

So ist der Tisch geht:

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

Aber ich will es so gehen, bevor ich die Gruppe tun durch:

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

Ich bin mit PHP mit ihm so, wenn jemand eine hat Idee, wie man die Ergebnisse mit einer PHP-Lösung bekommt.

Prost im Voraus :)

+0

+1 für eine solide Frage von einem relativ neuen Benutzer. Wenn alle Fragen in StackOverflow so wären, wäre die Welt ein besserer Ort. –

+0

+1 aus dem gleichen Grund des obigen Kommentars. Mach weiter! :) – kizzx2

Antwort

3

Wenn Sie wenige 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 

Wenn Sie viele DISTINCT IP haben' haben s:

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 

Erstellen von zwei Indizes für diese Tabelle :

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

wird diese Abfragen sehr verbessern.

Sehen Sie diesen Eintrag in meinem Blog für Leistungsdetails:

+0

Wow, danke! Das funktioniert perfekt! :) – hamstar