Transformer une requête sql imbriquée en deux requetes succesives

luciole135 Messages postés 2 Date d'inscription vendredi 14 janvier 2011 Statut Membre Dernière intervention 17 janvier 2011 - 14 janv. 2011 à 20:41
luciole135 Messages postés 2 Date d'inscription vendredi 14 janvier 2011 Statut Membre Dernière intervention 17 janvier 2011 - 17 janv. 2011 à 14:22
Bonsoir,
J'ai installé sur mon site WordPress, une extension de stats qui a une fonction qui permet de voir les dernières visites faites par un visiteur et d'afficher les pages visitées par celui-ci.
Mais cette extension de stat affiche pour chaque visiteur les visites d'une façon inadéquate :
si un visiteur est venu la première fois le 5 janvier et la deuxième fois le 11, l'extension affiche à la date du 5 janvier sa première visite puis les suivantes au lieu d'afficher à la date du 11 sa dernière visite puis les précédentes !
ce qui n'est pas pratique car ainsi, il n'apparait que les nouveaux visiteurs du jour et pas ceux qui reviennent (les fidèles);
La requête est la suivante :
$sql = "SELECT ip,nation,os,browser,agent FROM $table_name WHERE spider='' GROUP BY ip ORDER BY id DESC LIMIT $LimitValue, $LIMIT";
J'ai trouvé par chance en farfouillant dans les forums une personne qui avait le même probblème que moi et a résolu le problème par la requete suivante :
$sql = "SELECT ip,nation,os,browser,agent FROM $table_name WHERE ( spider='' and id in(select max(id) from $table_name group by ip )) order by id desc LIMIT $LimitValue, $LIMIT";

c'est à dire une requête imbriquée !
L'inconvénient, c'est que cette requete est très longue pour le serveur.
Je voudrais savoir s'il est possible de transformer cette deuxième requête en deux requêtes succésive :
la première collectant les max(id), c'est à dire les entrées les plus récentes dans la tables de données pour chaque IP.
Comme par exemple :
$sql_0 = select max(id) from $table_name group by ip qui retourne un tableau avec "id" la plus récente de chaque IP.

Et dans une deuxième requete
$sql = "SELECT ip,nation,os,browser,agent FROM $table_name WHERE (spider='' AND id IN $sql_0) ORDER BY id DESC LIMIT $LimitValue, $LIMIT";
Mais cela fait une erreur, apparemment car la condition WHERE IN ne permet pas de lire dans un tableau PHP.
Comment puis-je faire pour que la deuxième requête puisse-t-elle lire dans le tableau des max(id), c'est à dire les plus récente.

J'ai cherché à savoir si on pouvait transformer un tableau PHP en liste SQL, mais je n'ai rien trouvé sur le net.

Avez-vous une solution qui permette de transformer cette requête imbriquée (qui consomme beaucoup de temps pour pas grand chose) en deux requêtes succéssives ?

Merci de votre aide.
Luciole

Mon site perso quand on veut arrêter de fumer sans manque physique ni prise de poids : http://additifstabac.free.fr
Un blog ami à lire pour faire de même : http://defumesansadditifs.over-blog.com/
A voir également:

2 réponses

cs_ludwig59 Messages postés 128 Date d'inscription lundi 21 avril 2008 Statut Membre Dernière intervention 6 mai 2011 2
17 janv. 2011 à 10:39
Bonjour

Il y a la fonction implode de PHP qui permet de transformer un tableau en chaine de caractères.

Implode
0
luciole135 Messages postés 2 Date d'inscription vendredi 14 janvier 2011 Statut Membre Dernière intervention 17 janvier 2011
17 janv. 2011 à 14:22
Merci de votre réponse, en farfouillant sur le net je suis arrivé à corriger cette requête en utilisant un alias (AS) avec une fonction de stat (MAX) et en triant sur cet alias :
$sql = "SELECT ip,nation,os,browser,agent, max(id) as MaxId FROM $table_name WHERE spider='' GROUP BY ip ORDER BY MaxId DESC LIMIT $LimitValue, $LIMIT";
depuis, les requêtes sont triées correctement, de la plus récente à la plus vieille.

Résolu.


Mon site perso quand on veut arrêter de fumer sans manque physique ni prise de poids : http://additifstabac.free.fr
Un blog ami à lire pour faire de même : http://defumesansadditifs.over-blog.com/
0
Rejoignez-nous