Forum-webmaster
Technique - programmation => PHP / MySQL => Message commencé par: Sticky Mouse le le 27-04-2003 a 22:27:08

Titre: Message supprimé
Posté par: Sticky Mouse le le 27-04-2003 a 22:27:08

Message supprimé

Titre: Re:GROUP BY ?
Posté par: goa103 le le 01-05-2003 a 18:44:44

Salut,

Pour quelle utilisation exactement ? A ma connaissance tu ne peux pas utiliser GROUP BY et "LAST" ni LIMIT.

JM

Titre: Re:GROUP BY ?
Posté par: goa103 le le 01-05-2003 a 21:15:19

Bonsoir,

Je vois mieux le problème maintenant. J'ai rencontré le problème et 2 solutions se sont présentées:
- récupérer les IPs par un GROUP BY puis pour chaque IP, récupérer la date la plus récente par un WHERE de l'IP et un ORDER BY DESC (note: les dates MySQL sont au format YYYY-MM-DD pas YYYY-DD-MM comme dans ton exemple !)
- utiliser 2 tables. Une qui stocke toutes les visites (celle que tu utilises) et une autre qui s'occupe de stocker la date de la dernière visite pour une IP donnée. A chaque visite il faut donc insérer 2 fois l'IPs, une fois dans celle des visites et une autre fois dans celle des dernières visites. Si la fonction "retrouver toutes les dernières visites" n'est accessible qu'aux admins de ton site, tu peux même envisager de générer cette table (qui devient alors obsolète-temporaire) quand un admin en a besoin. Ce qui permet de ne faire qu'une insertion pour chaque visiteur. Ce qui est à mon avis la meilleure option, beaucoup de visiteurs mais peu d'admin.

Peut-être qu'un expert en MySQL pourrait trouver LA requête mais je ne pense pas qu'une requête compliqué est une bonne requête. Il y a toujours une manière plus logique d'aborder les choses. J'ai pensé que la solution admin/visiteur était la plus optimum... Alors c'est celle que j'ai choisi.

Un petit conseil. Pour le DATETIME, tu peux te servir de TIMESTAMP, une valeur "vide" signifie "date courante", ce qui t'évite d'avoir à insérer une date toi-même. Très pratique. Mais penses qu'il y a un laps de temps entre les insertions, si tu en fais 2, les temps serton différents. Si tu génères la table, aucun problème. Si tu utilises une seule variable PHP pour stocker le temps et un DATETIME, pas de problème non plus.

JM

Titre: Re:GROUP BY ?
Posté par: goa103 le le 01-05-2003 a 22:02:01

Rebonsoir,

Je pense qu'on s'est mal compris. Ta table peut avoir 20 champs si tu veux (navigateurs, os,...) mais la table "dernières visites" possède uniquement 2 champs: IP + Dernière date de visite. L'IP est en fait une clé étrangère vers la table Visites.

Donc même si ta table visites possèdent 150.000 entrées pour 5000 visites uniques. La table "dernières visites" n'aura QUE 5000 entrées. 1 entrée dans cette dernière, n dans celle des visites.

Ainsi soit-il :D
JM

Titre: Re:GROUP BY ?
Posté par: goa103 le le 02-05-2003 a 14:38:33

Bonjour,

Je t'ai répondu en fonction des informations que tu m'as fournies. Si tu souhaites une solution adaptée à ton problème il faut être plus précis.

JM

Titre: Re:GROUP BY ?
Posté par: goa103 le le 03-05-2003 a 19:57:21

J'ai finalement trouvé un élément de réponses sur un newsgroup (sgbd):

SELECT Ip,MAX(DateTimeInsertion) FROM Visites GROUP BY Ip

On sélectionne les dernières (MAX) visites en les groupant par Ip. Attention si tu souhaites récupérer d'autres données, tu dois créer une table temporaire et faire une jointure. Sauf si tu utilises une fonction (comme MAX) sur les champs à récupérer:

CREATE TEMPORARY TABLE tutu SELECT ip, min(date) as date FROM toto GROUP BY ip
SELECT toto.* from toto INNER JOIN tutu using(ip,date)
(merci à P'tit Marcel)

Comme MAX n'est pas directement reliée aux dates, je n'ai jamais pensé à l'utiliser pour ce problème. Bien pratique !

Désormais je crois que tu as tous les éléments pour résoudre ton problème !

Bonne chance,
JM


Forum-webmaster | Actionné par YaBB SE
© 2001-2003, YaBB SE Dev Team. Tous droits réservés.