Bonjour,
Pour une extension WordPress (StatPress-Visitors) que j'entretiens, j'ai besoin de faire un double tri avec une limitation de la recherche sur chaque critère de tri.
En plus clair, pour des stats, je veux afficher les 20 dernières visites des 50 dernières IP, ce qui correspond au log des visites (appelé SPY).
Je tente en vain de trouver une requête qui ne renvoit que ces résultats là.
La requête la plus rapide que j'ai trouvé utilise l'index primaire de la table de donnée (id) et est la suivante - elle fait une auto jointure de la table sur elle même - mais elle retourne toutes les visites des 50 dernières IP, et non pas uniquement les 20 dernières visites des 50 dernières IP - cela ne pose pas trop de problèmes car les IP sont rarement les mêmes d'un jour à l'autre sur mon site - :
Code :
- SELECT *
- FROM $table_name as T1
- JOIN
- (SELECT max(id) as MaxId, ip
- FROM $table_name
- WHERE spider=''
- GROUP BY ip
- ORDER BY MaxId DESC LIMIT $LimitValue, $LIMIT
- ) as T2
- ON T1.ip = T2.ip
- ORDER BY MaxId DESC, id DESC
|
J'ai tenté de numéroter les lignes en partant de 0 pour chaque IP, mais cela ne fonctionne pas, cela incrémente toutes les lignes indépendamment des IP (s'il y a 1000 lignes, alors cela numérote jusqu'à 1000) :
Code :
- SELECT *, @num:=@num+1 as numero
- FROM $table_name as T1
- JOIN
- (SELECT max(id) as MaxId, ip, @num:=0 as numero
- FROM $table_name
- WHERE spider=''
- GROUP BY ip
- ORDER BY MaxId DESC LIMIT $LimitValue, $LIMIT
- ) as T2
- ON T1.ip = T2.ip
- HAVING numero < 20
- ORDER BY MaxId DESC, id DESC
|
Le seul problème que j'ai avec la première requête n'est pas son temps d'excécution, mais son traitement en PHP. En effet, si la requête renvoit pour une table de 150 000 lignes, 1000 lignes en 1,6 sec. Leur traitement en PHP - qui n'est pas un langage compilé - prend sur mon site en local 30 secondes, ce qui est catastrophique.
Bon, malgré tout cette requête est plus rapide que celle du StatPress Original - qui elle fait un premier tri pour sélectionner les 50 dernières IP et fait 50 requêtes (une par IP) pour renvoyer les 20 dernières visites sur la table de donnée entière.
J'ai aussi fait une variante qui utilise une table temporaire contenant tous les résultats de la première requête, puis j'ai interrogé cette table autant de fois qu'il y a d'IP - comme le fait le StatPress Original -, cela n'accélère pas le traitement final par rapport à la première requête (mais l'accélère par rapport au StatPress original et ses dérivés), je ne vais pas plus vite, ni plus lentement d'ailleurs.
Est-il possible de faire en MySql un double tri selon deux critères différents en limitant séparemment le nombre de lignes renvoyées pour chaque critère ?
Je sèche complétement, toutes mes tentatives ont échouées.
- mais peut-on faire encore mieux en MySql ou est-ce comme il me semble impossible ?
Merci de vos lumières.
Message édité par luciole135 le 20-02-2012 à 01:35:39
---------------
Mon site perso quand on veut arrêter de fumer sans manque physique ni prise de poids : http://additifstabac.webuda.com/