IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[SQL] supprimer de manière "ordonnée" les doublons


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    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 : 72
    Points
    72
    Par défaut
    Salut,

    J'imagine que tu as déjà essayé avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

  3. #3
    Membre habitué Avatar de IllusionStriker
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 129
    Points : 179
    Points
    179
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    select distinct (ip)......
    ciao

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Bonsoir.

    Voici ma requête actuelle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $connect = 'SELECT * FROM cpg1410_map ORDER BY datetime DESC';
    Voici ce que cela me retourne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    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 : 72
    Points
    72
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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).

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  7. #7
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    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 : 72
    Points
    72
    Par défaut
    Supprime le champ url du GROUP BY.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    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...

  9. #9
    Membre habitué Avatar de IllusionStriker
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 129
    Points : 179
    Points
    179
    Par défaut
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    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

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    Citation Envoyé par IllusionStriker Voir le message
    salut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  11. #11
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    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 : 72
    Points
    72
    Par défaut
    Et ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT ip, url, MAX(datetime) AS max_datetime FROM cpg1410_map GROUP BY ip HAVING datetime=max_datetime ORDER BY ip;
    Good ?

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    error : Unknown column 'datetime' in 'having clause'

  13. #13
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    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 : 72
    Points
    72
    Par défaut
    Et si tu rajoutes datetime dans la liste des champs ?

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    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

  15. #15
    Membre habitué Avatar de IllusionStriker
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 129
    Points : 179
    Points
    179
    Par défaut
    salut,
    Citation Envoyé par picwic Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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é

  16. #16
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    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

  17. #17
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    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 : 72
    Points
    72
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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!!!

  18. #18
    Membre habitué Avatar de IllusionStriker
    Profil pro
    Étudiant
    Inscrit en
    Juin 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2007
    Messages : 129
    Points : 179
    Points
    179
    Par défaut
    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

  19. #19
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Octobre 2006
    Messages : 28
    Points : 18
    Points
    18
    Par défaut
    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.

  20. #20
    Membre régulier
    Profil pro
    Développeur informatique
    Inscrit en
    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 : 72
    Points
    72
    Par défaut
    On se détend!!!

    Essaye ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [SQL] Je n'arrive pas a effacer les doublons
    Par guillaumeIOB dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/09/2007, 18h39
  2. sql dynamic : passage de parametre entre quotes
    Par de LANFRANCHI dans le forum SQL
    Réponses: 12
    Dernier message: 26/05/2004, 16h09

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo