2009-06-08 5 views
4

J'ai une table contenant des données pagehit (normalisées) et j'ai besoin de saisir les 10 dernières ips uniques.Comment récupérer les 10 dernières adresses IP DISTINCT d'une table MySQL?

J'ai essayé de le faire comme ceci:

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

Ce qui devrait me donner ce résultat:

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

Ce sont les derniers visiteurs uniques sur le site.

Mais j'obtiens une erreur de syntaxe au lieu de ce résultat.

donc je dois faire cette requête:

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

Ce que je pensais être ok. Mais il donne ce résultat:

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

Mais qui définit l'ordre par date après sa déjà regroupées il saisit la première ips unique dans la table qui sont aussi les plus anciennes.

Alors la table va:

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

Mais je veux qu'il aille comme ça avant que je fais le groupe par:

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

J'utilise PHP avec elle donc si quelqu'un a un idée de comment obtenir les résultats avec une solution PHP.

Vive à l'avance :)

+0

+1 pour une question solide d'un utilisateur relativement nouveau. Si toutes les questions dans StackOverflow étaient comme ça, le monde serait un meilleur endroit. –

+0

+1 pour la même raison que le commentaire ci-dessus. Continuez! :) – kizzx2

Répondre

3

Si vous avez quelques 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 

Si vous avez beaucoup de DISTINCT IP' 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 

Création de deux index sur cette table :

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

va beaucoup améliorer ces requêtes.

Voir cette entrée dans mon blog pour plus de détails de performance:

+0

Wow merci! Cela fonctionne parfaitement! :) – hamstar