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 :

Requête SQL, sélectionner la plus récente réponse [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Requête SQL, sélectionner la plus récente réponse
    Bonjour à tous,
    je n'arrive pas à rédiger la requête SQL correspondant à mon besoin :
    J'ai une table avec ces champs : ID, EMAIL, REPONSE, DATE_REPONSE.
    Sur mon site quand un utilisateur clique sur un lien, cela provoque une insertion dans cette table avec son email, la date et "yes" ou "no" dans REPONSE.
    Mon besoin est de sélectionner par email la réponse la plus récente (puisque l'utilisateur peut changer d'avis). Donc soit l'ID le plus élevé, soit la DATE_REPONSE.

    Pour l'instant ma requête est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID, EMAIL, REPONSE, MAX(DATE_REPONSE) AS DATE_REPONSE 
    FROM save_the_date 
    GROUP BY EMAIL 
    ORDER BY REPONSE
    J'obtiens bien une seule ligne par email, et la date réponse est bien la plus récente.
    Mon problème est que le champ réponse ne correspond pas à la réponse la plus récente.

    Merci d'avance pour votre aide.

  2. #2
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT ID, EMAIL, REPONSE, MAX(DATE_REPONSE) AS DATE_REPONSE
    FROM save_the_date
    GROUP BY EMAIL
    ORDER BY REPONSE
    La requête fait exactement ce que tu lui dis de faire : elle sélectionne les ID, EMAIL, REPONSE ainsi que la DATE_REPONSE la plus élevée. Et avec ce GROUP BY EMAIL, tu obtiens en fait la réponse à la question « quelle est la date de l'enregistrement le plus récent » et non pas « quel est l'enregistrement le plus récent ».

    La solution est bien plus simple : je veux un enregistrement, SELECT ID, EMAIL, REPONSE FROM save_the_date, je veux le plus récent, ORDER BY DATE_REPONSE DESC et je n'en veux qu'un seul, LIMIT 0, 1.

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Merci de ton aide
    Mais je me suis mal exprimé, et j'ai surtout mis un très mauvais titre.

    En fait je cherche les réponses les plus récentes par email.
    C'est à dire : une réponse (la plus récente) par email différent.

  4. #4
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Ah d'accord. C'est ma faute, j'ai interprété trop vite ta question. Alors j'ai essayé WHERE DATE_REPONSE = MAX(DATE_REPONSE) mais apparemment on ne peut pas faire comme ça, donc je crois qu'il faut passer par une sous-requête. À moins que quelqu'un ait une meilleure idée.

    En attendant voilà ce que je propose :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ID, EMAIL, REPONSE, DATE_REPONSE FROM save_the_date
      INNER JOIN (
        SELECT MAX(DATE_REPONSE) maxdate FROM save_the_date GROUP BY EMAIL
      ) subquery
      ON DATE_REPONSE = maxdate

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    C'est parfait je te remercie !

    Je m'étais heurté également à l'impossibilité de faire "WHERE DATE_REPONSE = MAX(DATE_REPONSE)".

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 144
    Points
    144
    Par défaut
    Bonjour,

    Cette réponse n'est pas complète.

    La jointure doit également prendre en compte l'email sans quoi si un email a une date de réponse (non dernière) égale à la date de dernière réponse d'un autre email, alors il aura deux réponse.

  7. #7
    Expert éminent
    Avatar de Watilin
    Homme Profil pro
    En recherche d'emploi
    Inscrit en
    Juin 2010
    Messages
    3 094
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : En recherche d'emploi

    Informations forums :
    Inscription : Juin 2010
    Messages : 3 094
    Points : 6 755
    Points
    6 755
    Par défaut
    Ah bien vu, merci. Je savais bien que je pouvais pas avoir bon du premier coup
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT ID, EMAIL, REPONSE, DATE_REPONSE FROM save_the_date
      INNER JOIN (
        SELECT EMAIL, MAX(DATE_REPONSE) maxdate FROM save_the_date GROUP BY EMAIL
      ) subquery
      ON DATE_REPONSE = maxdate AND save_the_date.EMAIL = subquery.EMAIL

  8. #8
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    et simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT DISTINCT EMAIL, ID, REPONSE, DATE_REPONSE 
    FROM save_the_date 
    ORDER BY EMAIL ASC, DATE_REPONSE DESC
    ?

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 144
    Points
    144
    Par défaut
    Waitlin, ça me semble bon maintenant.

    jreaux62, ta requête va remonter quasiment toutes les réponses de tous les emails. pour rappel le distinct s'applique à l'ensemble du select donc y compris à la date (qui est probablement distincte à chaque réponse d'un email).

  10. #10
    Candidat au Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut
    Enfait, il subsiste un léger problème : quand on ajoute EMAIL dans la jointure cela
    crée une erreur car le champ EMAIL est ambigue.

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 101
    Points : 144
    Points
    144
    Par défaut
    Oui, c'est pour cela que Waitlin a préfixé le champs EMAIL avec des alias de table dans sa condition de jointure.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Aide requête SQL sur le plus mauvais joueur
    Par predalpha dans le forum Langage SQL
    Réponses: 8
    Dernier message: 22/07/2014, 11h03
  2. [11g] Problème de requête sur colonne la plus récente
    Par adrien1 dans le forum SQL
    Réponses: 1
    Dernier message: 17/12/2013, 10h08
  3. [AC-2007] Requête complexe : statut le plus récent de plusieurs dossiers
    Par johnny_titan dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 12/01/2011, 15h06
  4. Requête SQL- ressortir le plus récent enregistrement
    Par shirya dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 28/05/2008, 22h38
  5. [SQL] Sélectionner la plus petite valeur
    Par Gabout dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 30/04/2007, 11h36

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