Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 06/02/2008, 22h55   #1
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
Par défaut [SQL] supprimer de manière "ordonnée" les doublons

Bonjour,

J'ai une requête qui affiche une boucle :

Mais il y a souvent des doublons :

Code :
1
2
3
4
5
6
 
132 - index.html - 10.12.2007
132 - index.html - 9.12.2007
132 - index.html - 8.12.2007
127 - index.html - 20.12.2007
127 - index.html - 10.12.2007
J'aimerais n'afficher qu'une seule ligne par IP mais que ce soit la plus récente. J'ai bien essayé avec DISTINCT et GROUP BY mais je n'arrive pas à ordonner mon résultat.

Est ce que quelqu'un peut m'aider ?

Merci d'avance
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 15h17   #2
Membre du Club
 
Développeur informatique
Inscription : janvier 2008
Messages : 92
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2008
Messages : 92
Points : 62
Points : 62
Salut,

J'imagine que tu as déjà essayé avec :
Code :
1
2
 
SELECT ip, url, date FROM ... WHERE ... GROUP BY ip, url ORDER BY ip, date DESC;
Envois une description de tes champs (typage notamment).
__________________
Heureusement qu'on n'envoie pas des fusées..!
picwic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 15h27   #3
Membre habitué
 
Avatar de IllusionStriker
 
Étudiant
Inscription : juin 2007
Messages : 129
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2007
Messages : 129
Points : 147
Points : 147
salut,
ta requete aussi pourrait nous aidé!
mais pour ce que tu veux faire c'est bien l'utilisation du distinct qu'il te faut
Code :
select distinct (ip)......
ciao
__________________
Ne me vouvoie pas je ne suis pas supérieur à toi!
moi je tutoie mais je vous assure que le respect y est!
IllusionStriker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 19h13   #4
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
Bonsoir.

Voici ma requête actuelle :

Code :
1
2
 
$connect = 'SELECT * FROM cpg1410_map ORDER BY datetime DESC';
Voici ce que cela me retourne
Code :
1
2
3
4
5
6
7
8
 
38.99*** - /displayimage.php?pos=-3467 - 1202407810
66.249*** - /displayimage.php?album=random&cat=0&pos=-20842 - 1202407787
38.99*** - /displayimage.php?album=276&pos=4 - 1202407699
66.249*** - /displayimage.php?album=379&pos=156 - 1202407680
38.99*** - /displayimage.php?pos=-15406 - 1202407643
38.99*** - /thumbnails.php?album=357&page=4 - 1202407621
38.99*** - /displayimage.php?album=440&pos=45 - 1202407582
La liste doit être triée par time descendant.
J'aimerais que ma liste ne comporte qu'une ligne par IP, l'enregistrement le plus récent. Exemple :

Code :
1
2
3
 
38.99*** - /displayimage.php?pos=-3467 - 1202407810
66.249*** - /displayimage.php?album=random&cat=0&pos=-20842 - 1202407787
Avec GROUP BY ça fonctionne mais il ne me prend que les anciens enregistrements...

Avec DISTINCT ça bug, visiblement on peut pas faire un SELECT *, on ne doit prendre qu'une colonne.
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 19h41   #5
Membre du Club
 
Développeur informatique
Inscription : janvier 2008
Messages : 92
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2008
Messages : 92
Points : 62
Points : 62
Code :
1
2
 
SELECT ip, url, datetime FROM cpg1410_map GROUP BY ip, url ORDER BY ip ASC, datetime DESC;
As-tu essayé ?

ps: Fuis comme la peste le SELECT *. Il faut toujours nommer explicitement les champs que l'on souhaite sélectionner et les préfixer avec le nom de la table (si jointures).
__________________
Heureusement qu'on n'envoie pas des fusées..!
picwic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 20h00   #6
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
Merci du conseil.
J'ai essayé ta requête. C'est mieux mais il manque un détail. Il y a toujours plusieurs sorties pour un ip. Exemple

Code :
1
2
3
4
5
6
7
8
9
 
38.99*** - /displayimage.php?pos=-3467 - 1202407810
38.99*** - /displayimage.php?pos=-15406 - 1202407643
38.99*** - /thumbnails.php?album=357&page=4 - 1202407621
38.99*** - /displayimage.php?album=440&pos=45 - 1202407582
1202407787
38.99*** - /displayimage.php?album=276&pos=4 - 1202407699
66.249*** - /displayimage.php?album=random&cat=0&pos=-20842 - 
66.249*** - /displayimage.php?album=379&pos=156 - 1202407680
les ip sont maintenant regroupés et triés par date descendante. Mais j'aimerais n'avoir que le dernier enregistrement pour chaque ip.
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 20h06   #7
Membre du Club
 
Développeur informatique
Inscription : janvier 2008
Messages : 92
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2008
Messages : 92
Points : 62
Points : 62
Supprime le champ url du GROUP BY.
__________________
Heureusement qu'on n'envoie pas des fusées..!
picwic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 20h10   #8
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
Je n'ai plus qu'un ip par ligne. C'est cool. Mais ce n'est pas le dernier enregistrement qu'il me sort mais le premier...
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 20h11   #9
Membre habitué
 
Avatar de IllusionStriker
 
Étudiant
Inscription : juin 2007
Messages : 129
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2007
Messages : 129
Points : 147
Points : 147
salut
Code :
SELECT distinct(ip), url, datetime FROM cpg1410_map GROUP BY ip, url ORDER BY ip ASC, datetime DESC;
ceci devrai t'éliminer les doublons d'ip
Citation:
Mais j'aimerais n'avoir que le dernier enregistrement pour chaque ip.
par contre je suis pas sur qu'il te garde uniquement la derniere connection si c'est pas le cas va falloir que tu ajoute une contrainte dans la close where de ta requète
bonne soirée
ciao
__________________
Ne me vouvoie pas je ne suis pas supérieur à toi!
moi je tutoie mais je vous assure que le respect y est!
IllusionStriker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 20h24   #10
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
Citation:
Envoyé par IllusionStriker Voir le message
salut
Code :
SELECT distinct(ip), url, datetime FROM cpg1410_map GROUP BY ip, url ORDER BY ip ASC, datetime DESC;
ceci devrai t'éliminer les doublons d'ip
par contre je suis pas sur qu'il te garde uniquement la derniere connection si c'est pas le cas va falloir que tu ajoute une contrainte dans la close where de ta requète
bonne soirée
ciao

En supprimant le url dans group by j'obtiens le même résultat qu'avant. J'ai effectivement 1 ip par ligne mais c'est toujours la première valeur qu'il me sort et pas la dernière.
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 20h34   #11
Membre du Club
 
Développeur informatique
Inscription : janvier 2008
Messages : 92
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2008
Messages : 92
Points : 62
Points : 62
Et ça:
Code :
SELECT ip, url, MAX(datetime) AS max_datetime FROM cpg1410_map GROUP BY ip HAVING datetime=max_datetime ORDER BY ip;
Good ?
__________________
Heureusement qu'on n'envoie pas des fusées..!
picwic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 23h05   #12
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
error : Unknown column 'datetime' in 'having clause'
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 07/02/2008, 23h16   #13
Membre du Club
 
Développeur informatique
Inscription : janvier 2008
Messages : 92
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2008
Messages : 92
Points : 62
Points : 62
Et si tu rajoutes datetime dans la liste des champs ?
__________________
Heureusement qu'on n'envoie pas des fusées..!
picwic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 07h16   #14
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
error : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MAX(datetime) AS max_datetime FROM cpg1410_map GROUP BY ip HAVING datetime=max_d' at line 1
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 08h35   #15
Membre habitué
 
Avatar de IllusionStriker
 
Étudiant
Inscription : juin 2007
Messages : 129
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2007
Messages : 129
Points : 147
Points : 147
salut,
Citation:
Envoyé par picwic Voir le message
Code :
SELECT ip, url, MAX(datetime) AS max_datetime FROM cpg1410_map GROUP BY ip HAVING datetime=max_datetime ORDER BY ip;
pourquoi tu met un having? alors que tu recupère deja le MAX de datetime
ce qui est en rouge est a exclure et si tu a une colone datetime dans ta table cela devrai fonctionné
__________________
Ne me vouvoie pas je ne suis pas supérieur à toi!
moi je tutoie mais je vous assure que le respect y est!
IllusionStriker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 09h47   #16
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
Hum... toujours une erreur :

error : You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'MAX(datetime) FROM cpg1410_map GROUP BY ip ORDER BY ip' at line 1
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 11h40   #17
Membre du Club
 
Développeur informatique
Inscription : janvier 2008
Messages : 92
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2008
Messages : 92
Points : 62
Points : 62
Citation:
Envoyé par IllusionStriker Voir le message
ce qui est en rouge est à exclure et si tu as une colonne datetime dans ta table cela devrait fonctionner
Si comme tu le préconises on fait :
Code :
1
2
3
4
5
6
7
8
9
 
SELECT
  ip,
  url,
  MAX(datetime)
FROM
  cpg1410_map
GROUP BY ip
ORDER BY ip;
le champ date, quand bien même le plus récent, n'est pas en corrélation avec le champ url.

ps: merci de veiller à l'orthographe!!!
__________________
Heureusement qu'on n'envoie pas des fusées..!
picwic est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 11h42   #18
Membre habitué
 
Avatar de IllusionStriker
 
Étudiant
Inscription : juin 2007
Messages : 129
Détails du profil
Informations personnelles :
Âge : 25

Informations professionnelles :
Activité : Étudiant

Informations forums :
Inscription : juin 2007
Messages : 129
Points : 147
Points : 147
arrrrffff ben desolé je sèche j'ai pas d'autre idée ....si cela me vient je t'en fait part dès que possible!
ciao
__________________
Ne me vouvoie pas je ne suis pas supérieur à toi!
moi je tutoie mais je vous assure que le respect y est!
IllusionStriker est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 11h50   #19
Invité régulier
 
Inscription : octobre 2006
Messages : 25
Détails du profil
Informations forums :
Inscription : octobre 2006
Messages : 25
Points : 9
Points : 9
C'est vraiment désespérant.
Ne puis-je pas stocker toutes les données de ma requête dans un array puis le trier avec une boucle pour obtenir le résultat désiré ?

Malheureusement je ne sais très bien quoi donner comme condition pour réaliser cette boucle. Quelqu'un pourrait-il m'aider ?
Merci pour votre aide.
easyjava est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/02/2008, 11h55   #20
Membre du Club
 
Développeur informatique
Inscription : janvier 2008
Messages : 92
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur informatique

Informations forums :
Inscription : janvier 2008
Messages : 92
Points : 62
Points : 62
On se détend!!!

Essaye ça:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
SELECT
    cpg1410_map.ip, cpg1410_map.url, cpg1410_map.date
FROM
    cpg1410_map
INNER JOIN (
    SELECT
        MAX(date) AS date, ip
    FROM
        cpg1410_map
    WHERE
        cpg1410_map.date = date
    GROUP BY
        ip
) b ON (cpg1410_map.ip = b.ip AND cpg1410_map.date = b.date) 
ORDER BY
    cpg1410_map.date
__________________
Heureusement qu'on n'envoie pas des fusées..!
picwic est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 18h54.


 
 
 
 
Partenaires

Hébergement Web