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

Langage SQL Discussion :

Récupérer l'état actuel de chaque "contact"


Sujet :

Langage SQL

  1. #1
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut Récupérer l'état actuel de chaque "contact"
    Bonjour,

    Je suis entrain de réaliser un blog ou les membres peuvent contacter l'admin(donc moi) par mail...
    Ces contacts sont également enregistré dans la base de données.

    Pour cela, j'ai :
    1) Une table 'contact'
    Colonne Type
    id int
    auteur_id int
    concerne varchar
    sujet varchar
    description varchar
    Voici quelques exemple de données :
    id auteur_id concerne sujet description
    1 1 article problème affichage l'affichage sou IE est pas belle
    2 3 tags mauvais tag d'après moi le tag pour l'article '125' n'est pas correct d'après moi...
    3 2 autre idée d'innovation pourquoi ne pas faire un sondage concernant la présentation des articles ?!

    2) Une table 'contact_historique'
    colonne type
    id int
    contact_id int
    date datetime
    etat_id int
    Voici quelques exemple de données :
    id contact_id date etat_id
    1 1 2015-01-10 22:20:10 1
    2 1 2015-01-10 22:20:11 2
    3 1 2015-01-20 10:50:10 5
    4 2 2014-12-22 09:25:10 1
    5 2 2014-12-22 09:26:01 2
    6 3 2015-01-15 20:10:05 1

    3) Une table 'contact_etat'
    colonne type
    id int
    libelle varchar
    Voici les états possibles :
    id libelle
    1 Création
    2 Envoyé à l'admin
    3 Erreur d'envoi à l'admin
    4 En cours d'action
    5 Résolu
    6 Refusé

    Voici un exemple de ce que je souhaiterais obtenir comme résultat :
    id du contact date historique id de l'état actuel libellé de l'état actuel
    1 2015-01-20 10:50:10 5 Résolu
    2 2014-12-22 09:26:01 2 Envoyé à l'admin
    3 2015-01-15 20:10:05 1 Création

    Donc comme vous pouvez le constater, je souhaite obtenir le dernier état(état actuel) pour chaque contact avec le libellé correspondant mais malheureusement je bloque un peu
    Je pense qu'il faudrait que je prenne le max de la date pour chacun des contact mais je voit pas très bien comment faire.
    Si vous pouvez m'aider à y voir plus clair ce serait génial?!

    Merci par avance.
    Loïc.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Bonjour,
    La recherche "du dernier par ordre chronologique" revient régulièrement sur ce forum.
    Une recherche s'impose !

    Tatayo.

  3. #3
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut
    Bonjour,
    Tout d'abord merci pour la réponse.
    J'ai déjà regardé sur le forum mais je n'est pas trouvé l'aide requis pour résoudre mon problème.
    Désolé de revenir que maintenant sur mon problème mais j'ai malheureusement pas pu revenir plutôt..
    Sinon j'ai fait un début de requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT contact_id, MAX( date ) AS max_date
    FROM contact_historique AS ch
    GROUP BY contact_id
    Cette requête me permet bien de récupérer la dernière date de chaque contact mais je bloque pour récupérer l'id et le libellé de l'état correspondant à cette date et à ce contact.
    Auriez-vous une idée de comment faire s'il vous plaît ?!

    Merci par avance.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Responsable Données
    Inscrit en
    Janvier 2009
    Messages
    5 197
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable Données

    Informations forums :
    Inscription : Janvier 2009
    Messages : 5 197
    Points : 12 772
    Points
    12 772
    Par défaut
    Allez, un début de piste
    Tu as au moins deux façons de faire:
    1. Considérer que le dernier, c'est celui pour lequel il n'en existe pas avec une date supérieure
    2. Considérer que le dernier est celui qui possède la date la plus grande (au sens mathématique)

    Il y a certainement d'autres façons de faire.

    J'avoue aussi que je ne sais pas quelle est la version la plus optimisée.

    Lire aussi les cours et tutoriels pour apprendre SQL.
    Tatayo.

  5. #5
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Chef de projets
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2010
    Messages : 4 147
    Points : 7 392
    Points
    7 392
    Billets dans le blog
    1
    Par défaut
    Il doit y avoir une solution aussi avec rank(), et c'est même certainement la plus rapide. Mais vu que je galère toujours 3 plombes avec les fonctions de fenêtrage, autant commencer avec les méthodes de tatayo, qui sont plus "old school", mais aussi plus simple à appréhender
    On ne jouit bien que de ce qu’on partage.

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par loic20h28 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT contact_id, MAX( date ) AS max_date
    FROM contact_historique AS ch
    GROUP BY contact_id
    Cette requête me permet bien de récupérer la dernière date de chaque contact mais je bloque pour récupérer l'id et le libellé de l'état correspondant à cette date et à ce contact.
    Il suffit d'utiliser cette requête en tant que sous-requête en jointure.
    Ca devrait donner à peu près ç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
    SELECT h.id AS id_contact, 
        h.date AS date_dernier_etat, // Il ne faut pas nommer les colonnes avec des mots du langage SQL !
        e.id AS id_etat,
        e.libelle AS libelle_etat
    FROM contact_historique AS ch
    INNER JOIN contact_etat e ON e.id = h.etat_id
    INNER JOIN 
    (
        SELECT contact_id, 
            MAX(date) AS max_date
        FROM contact_historique
        GROUP BY contact_id
    ) tmp
        ON tmp.contact_id = h.contact_id
        AND tmp.max_date = h.date
    ORDER BY h.id
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Débutant  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    1 571
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 571
    Points : 353
    Points
    353
    Par défaut
    Tout d'abord merci à tous pour votre réponse
    Merci à CinePhil, pour ta requête qui en effet fonctionne. J'en était presque pas loin vu que j'avais un bout

    Cordialement

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

Discussions similaires

  1. comment récupérer l'état d'un capteur?
    Par r0d dans le forum Périphériques
    Réponses: 8
    Dernier message: 17/08/2005, 20h13
  2. Réponses: 5
    Dernier message: 22/12/2004, 16h50
  3. Réponses: 3
    Dernier message: 23/01/2004, 21h02

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