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

Requêtes MySQL Discussion :

Group BY et dernier enregistrement


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut Group BY et dernier enregistrement
    Bonjour à tous, et merci d'avance de vous attarder sur mon problème.

    Je veux essayer d'être le plus précis possible.

    Je boss actuellement sur un site qui doit disposer d'une boite de réception de messages privés.

    Les messages doivent être organisés sous forme de "conversations" , c'est à dire par "Sujet", un peu comme on peut trouver sur Outlook.com.


    Concernant ma base de donnée, et notamment une table bien spécifique nommée wp_pm (table wordpress), voici sa structure :

    id / subject / content / sender / recipient / date / deleted / unread


    id= correspond à l'ID unique du message (auto incrémenté)
    subject = le sujet du message
    content = le contenu du message
    sender = l'id de l'expéditeur du message
    recipient = l'id du destinataire du message
    date = date d'envoie du message
    deleted = si le message a été mis dans la corbeille (1 ou 0)
    unread = si le message a été lu (1 ou 0)


    Ca c'est pour la base.


    Pour mon affichage, je souhaite que les messages soient regroupés par "SUJET" afin d'éviter que trop de messages ne soient affichés dans la boite de réception si les échanges entre les deux utilisateurs sont longs.


    Voici de ou je suis parti (en sachant que je récupère également le nom d'utilisateur dans une autre table wp_users :


    Voici un exemple de données (fictifs) trier par une requête simple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT u.user_login, m.id, m.subject,m.content, m.sender ,m.recipient, m.date, m.unread, m.deleted 
    FROM wp_pm m 
    LEFT JOIN wp_users u ON m.sender=u.id 
    WHERE recipient='$id_user' 
    AND deleted='0' 
    ORDER BY m.date ASC
    $id_user correspond juste à l'ID de l'utilisateur qui consulte sa boite de reception.



    1 / Sujet1 / Mon contenu / 1 / 2 / 01/01/2013 / 0 / 0


    2/ Sujet1 /Mon contenu / 1/ 2 / 02/01/2013 / 0 / 0


    3/ Sujet1 /Mon contenu / 1 / 2 / 03/01/2013 / 0 / 0


    4/ Sujet1 /Mon contenu / 1 / 2 / 04/01/2013 / 0 / 0



    5/ Sujet2 /Mon contenu / 1 / 2 / 05/01/2013 / 0 / 0



    je vous ai mis des couleurs juste pour que vous différencier bien les deux "conversations". Donc en gros là je trie tous les messages par date. Rien de plus simple.


    Maintenant je veux éviter que "tous" les messages soient affichés, et les regrouper par "sujet" et d'afficher juste le dernier message en date pour une conversation. Pour les regrouper j'utilise donc un Group By subject :



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT u.user_login, m.id, m.subject,m.content, m.sender ,m.recipient, m.date, m.unread, m.deleted 
    FROM wp_pm m 
    LEFT JOIN wp_users u ON m.sender=u.id 
    WHERE recipient='$id_user' 
    AND deleted='0'
    GROUP BY subject 
    ORDER BY m.date ASC

    Il me regroupe bien mes messages par sujets mais je voudrais qu'il affiche pour chaque "groupe" le DERNIER message écrit, hors il m'affiche le PREMIER ce qui donne :

    1 / Sujet1 / Mon contenu / 1 / 2 / 01/01/2013 / 0 / 0


    5/ Sujet2 /Mon contenu / 1 / 2 / 05/01/2013 / 0 / 0



    Je voudrais donc que le résultat soit plutot :


    1 / Sujet1 / Mon contenu / 1 / 2 / 04/01/2013 / 0 / 0 (dernier "Sujet1")


    5/ Sujet2 /Mon contenu / 1 / 2 / 05/01/2013 / 0 / 0


    Et c'est ici que je bloque, je ne vois pas comment forcer ma requete à afficher le dernier message de chaque "groupe", au lieu du premier.

    Le probleme étant qu'il "groupe" les messages avant d'avoir "trié par date" , donc je ne sais pas trop comment faire :/


    Encore merci pour votre aide !

  2. #2
    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
    Question classique maintes fois abordée, surtout chez MySQL qui autorise ce GROUP BY faux !

    1) Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de groupage doivent figurer dans le GROUP BY sous peine de voir des valeurs aléatoires pour les colonnes manquantes.
    Il faut donc commencer par récupérer la date du dernier message par sujet puis faire une jointure de cette requête avec la table pour récupérer les autres informations du message correspondant à cette date.

    2) 'date' est un mauvais nom de colonne car c'est un mot réservé du langage SQL.

    3) Inutile d'entourer les valeurs numériques avec des apostrophes !

    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 u.user_login, m.id, m.subject,m.content, m.sender ,m.recipient, m.`date`, m.unread, m.deleted
    FROM wp_pm m
    INNER JOIN wp_users u ON m.sender = u.id
    INNER JOIN
    (
    	SELECT recipient, subject,
    		MAX(`date`) AS date_dernier_msg
    	FROM wp_pm
    	WHERE recipient = $id_user
    	GROUP BY recipient, subject
    ) tmp
    	ON tmp.subject = m.subject
    	AND tmp.recipient = m.recipient
    	AND tmp.date_dernier_msg = m.`date`
    WHERE m.deleted = 0
    ORDER BY m.`date` ASC
    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 !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Merci beaucoup CinePhil, je test ça d'ici une heure et je reviendrais vous dire si ça fonctionne.

    Je sais que la question est souvent abordé, mais les réponses des autres topics n'ont pas été d'un grand secours pour mon cas. Je vais changer le nom de la colonne 'date', c'est une Table utilisé par un plug-in Wordpress donc je ne voulais pas l'a modifier au départ.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    37
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 37
    Points : 23
    Points
    23
    Par défaut
    Bon donc c'est parfait c'est exactement ce que je cherchais , merci beaucoup

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

Discussions similaires

  1. [MariaDB] Dernier enregistrement + GROUP BY
    Par mikael2235 dans le forum Requêtes
    Réponses: 7
    Dernier message: 13/03/2015, 09h45
  2. [MySQL-5.0] GROUP BY qui ne donne pas les derniers enregistrements
    Par laul33 dans le forum Requêtes
    Réponses: 5
    Dernier message: 08/03/2014, 15h05
  3. [Toutes versions] Dernier enregistrement groupés
    Par DonKnacki dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 11/09/2012, 11h47
  4. [LINQ] Dernier enregistrement d'un groupe
    Par Amuny dans le forum VB.NET
    Réponses: 2
    Dernier message: 17/08/2012, 15h00
  5. dernier enregistrement par group by
    Par startout dans le forum Langage SQL
    Réponses: 8
    Dernier message: 03/07/2006, 16h05

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