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 :

Afficher le dernier message de chaque MP dans la liste des MP


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut Afficher le dernier message de chaque MP dans la liste des MP
    Bonjour à tous,

    Je dispose actuellement d'une messagerie privée, J'aimerais changer la disposition des messages dans la page d'accueil.
    Pour vous donner un exemple, j'aimerais afficher le pseudo, le dernier message envoyé à la personne ou alors, le dernier message reçu de la part de la personne et la date.
    Un petit peu à la manière de la page d'accueil des messages privés de Facebook.

    Voici actuellement la table des messages avec quelques messages testent.
    Avez-vous une idée de comment faire la chose ?

    Ce n'est pas facile, j'espère avoir été le plus clair possible

    Merci d'avance à tous

    Code sql : 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
    18
    19
    20
    CREATE TABLE IF NOT EXISTS `mps` (
    **`id_message` int(11) NOT NULL auto_increment,
    **`id_destinataire` int(11) NOT NULL,
    **`id_expediteur` int(11) default NULL,
    **`content` text,
    **`created` timestamp NOT NULL default CURRENT_TIMESTAMP,
    **`lu` enum('0','1') default NULL,
    **PRIMARY KEY* (`id_message`)
    ) ENGINE=MyISAM* DEFAULT CHARSET=utf8 AUTO_INCREMENT=6 ;
    *
    --
    -- Contenu de la table `mps`
    --
    *
    INSERT INTO `mps` (`id_message`, `id_destinataire`, `id_expediteur`, `content`, `created`, `lu`) VALUES
    (1, 2, 1, 'bonjour monsieur ', '2013-06-04 17:49:51', NULL),
    (2, 1, 2, 'Hey ! ', '2013-06-04 20:57:20', NULL),
    (3, 3, 1, 'Coucou ! Ça va ? ', '2013-06-04 20:57:21', NULL),
    (4, 0, 2, 'Test mp\n\n', '2013-06-04 20:57:21', NULL),
    (5, 1, 3, 'Bien et toi ? ', '2013-06-04 20:57:26', NULL);

  2. #2
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Utilises les clauses SQL "ORDER BY" (pour ordonner les résultats) et "LIMIT" (pour limiter le nombre de résultat retourné) :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY created DESC LIMIT 1
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    J'ai déjà essayé mais ça affiche juste le dernier mp parmi les discussions

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Faut peut être faire un effort quand même
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT cequetuveux FROM mps
    WHERE id_destinaire = xxx OR id_expediteur = xxx
    ORDER BY created DESC
    LIMIT 1
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Je sais ça mais c'est surtout pour le WHERE le problème....

    Suivant les discussions, je peux parfois être le id_destinataire et parfois le id_expediteur

    Il faut plusieurs requêtes je pense non ?

  6. #6
    Rédacteur

    Avatar de Bovino
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2008
    Messages
    23 647
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2008
    Messages : 23 647
    Points : 91 418
    Points
    91 418
    Billets dans le blog
    20
    Par défaut
    je peux parfois être le id_destinataire et parfois le id_expediteur
    Ah zut... dommage que le or soit uniquement là pour faire joli...
    Pas de question technique par MP !
    Tout le monde peut participer à developpez.com, vous avez une idée, contactez-moi !
    Mes formations video2brain : La formation complète sur JavaScriptJavaScript et le DOM par la pratiquePHP 5 et MySQL : les fondamentaux
    Mon livre sur jQuery
    Module Firefox / Chrome d'intégration de JSFiddle et CodePen sur le forum

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Je pense que je me suis mal exprimé, excusez moi.

    Ce que je cherche à reproduire est la liste des différents échanges de messages privés (avec A, B, J, M par exemple)
    Et d'avoir dans cette liste un aperçu du dernier message... (message envoyé et message reçu)

    Comme la listes des messages privés de Facebook ou Twitter pour vous donnez un exemple

  8. #8
    Membre expert
    Avatar de Spartacusply
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2011
    Messages
    1 723
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2011
    Messages : 1 723
    Points : 3 274
    Points
    3 274
    Par défaut
    Oui ok c'est pas exactement ce qui a été dit, enfin bon, ça reste dans le même genre quand même...


    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (id_destinaire = xxx AND id_expediteur = yyy ) OR (id_expediteur = xxx AND id_expediteur = yyy)
    Un message utile vous a aidé ? N'oubliez pas le

    www.simplifions.fr - Simplifier vos comptes entre amis !

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Je ne savais pas que c'est la combinaison était possible...
    Je pense qu'il faut plusieurs requêtes non ? Pour trouver les id..

    Sur un site américain, une personne donne cette requête, mais j'avoue que j'ai du mal à la déchiffrer Oo
    Code sql : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    SELECT 
    	    mm.recipient_id,
    	    m.*,
    	    U.id,
    		U.username,
    		U.name,
    		U.type_account,
    		U.avatar,
    		U2.id id_2,
    		U2.username username2,
    		U2.name name2,
    		U2.type_account type_account2,
    		U2.avatar avatar2
    		FROM (
    		  SELECT
    		  `from`,
    		  `to`,
    		    `from` + `to` - 1 as recipient_id,
    		    Max(id) as id
    		  FROM
    		    messages
    		  WHERE
    		    `from` = :id && remove_from = '1'  ||
    		    `to` = :id && remove_from = '1'
    		  GROUP BY
    		    `from` + `to` - 1
    		  ) mm
    		    INNER JOIN
    		  messages m
    		    On
    		  mm.id = m.id
    		  LEFT JOIN users U ON U.id = mm.`to`
    		  LEFT JOIN users U2 ON U2.id = mm.`from` 
    		  ORDER BY date DESC

  10. #10
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Sur la base de cette source :
    http://mysql.developpez.com/telechar...aque-categorie

    Tu peux faire un truc comme ç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
    18
    SELECT
       *
    FROM
       mps m
    WHERE
       m.id_destinataire = :id_membre AND
       (
          SELECT
             COUNT(*)
          FROM
             mps m1
          WHERE
             m1.id_expediteur   = m.id_expediteur AND
             m1.id_destinataire = m.id_destinataire AND
             m1.id_message > m.id_message
       ) < 1
    ORDER BY
       m.id_message DESC

  11. #11
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Et sans doute un peu moins performant, mais avec plus d'informations (comme savoir si on a répondu, le nombre de messages dans la discussion) :

    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
    18
    19
    20
    21
    SELECT
       *,
       COUNT( * ) nb_messages
    FROM
       (
          SELECT
             *,
             IF ( m.id_destinataire = :id_membre, m.id_expediteur, m.id_destinataire ) autre_membre,
             IF ( m.id_expediteur   = :id_membre, 1, 0 ) repondu
          FROM
             mps m
          WHERE
             m.id_expediteur   = :id_membre OR
             m.id_destinataire = :id_membre
          ORDER BY
             m.id_message DESC
       ) tmp
    GROUP BY
       tmp.autre_membre
    ORDER BY
       tmp.id_message DESC

  12. #12
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Bisûnûrs Voir le message
    Sur la base de cette source :
    http://mysql.developpez.com/telechar...aque-categorie

    Tu peux faire un truc comme ç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
    18
    SELECT
       *
    FROM
       mps m
    WHERE
       m.id_destinataire = :id_membre AND
       (
          SELECT
             COUNT(*)
          FROM
             mps m1
          WHERE
             m1.id_expediteur   = m.id_expediteur AND
             m1.id_destinataire = m.id_destinataire AND
             m1.id_message > m.id_message
       ) < 1
    ORDER BY
       m.id_message DESC
    Voici l'erreur que j'obtiens :
    Error Number: 1064

    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 ':id_membre AND ( SELECT COUNT(*) FROM mps m1 ' at line 6


    J'ai m'excuse encore, mais comme c'est la première fois que je vois une requête pareil...
    " :id_membre " À quoi servent les deux points avant le mot?

  13. #13
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    C'était à remplacer par l'id de ton membre à toi.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Ah d'accord ^^ et moi qui cherchais sur google pourquoi les : ID_DU_MEMBRE était plus compréhensible xD

    Par contre, maintenant c'est : Unknown column 'm1.id_message' in 'where clause'
    Pourtant la colone id_message de m1 (mps) existe...

  15. #15
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Finalement c'était une erreur de ma part
    Donc ça fonctionne bien merci

    Par contre j'ai deux petites questions

    comme j'aime bien comprendre les choses.
    En quoi la deuxième requête est moins performante ?

    Je veux faire une jointure pour récupérer le pseudo et l'avatar.
    Je dois faire cette jointure sur quel champ étant donné que la personne en face peut parfois être le destinataire mais aussi l'expéditeur ?

  16. #16
    Modérateur
    Avatar de Bisûnûrs
    Profil pro
    Développeur Web
    Inscrit en
    Janvier 2004
    Messages
    9 868
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Janvier 2004
    Messages : 9 868
    Points : 16 258
    Points
    16 258
    Par défaut
    Citation Envoyé par solodown Voir le message
    En quoi la deuxième requête est moins performante ?
    Si tu fais un EXPLAIN sur les requêtes tu verras que la 2e utilise un fichier temporaire. Donc si la différence ne se voit pas sur quelques centaines d'enregistrements, quand tu en auras quelques milliers ou centaines de milliers, je pense que la 2e requête sera un peu lourde.

    Citation Envoyé par solodown Voir le message
    Je veux fais une jointure pour récupérer le pseudo et l'avatar
    je dois faire cette jointure sur quel champ étant donné que la personne en face peut parfois être le destinataire mais aussi l'expéditeur
    Si tu veux lier sur l'autre membre pour avoir l'avatar et le pseudo de l'autre membre, tu lies la table tmp avec ta table pseudo sur le champ autre_membre.

  17. #17
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup pour ton aide précieuse !!!!!

    Pour finir, histoire que je pars pas bêtement en n'ayant rien appris.
    Étant donné que jusqu'à maintenant j'ai toujours fait des requêtes relativement simple, peux-tu me détailler exactement ta requêtes ? (Faire une requêtes complèxe pour les nuls ^^)

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Je vais pas faire un nouveau sujet juste pour ça alors je me permets de poser ma question ici comme c'est dans la continuité.

    Alors je suis un peu perdu dans l'affichage de la conversation... Par rapport aux champs id_expediteur et id_destinataire
    Avec ce bout de code ça ne m'affiche.... RIEN^^j'ai essayé plusieurs combinaisons, pareil
    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
    18
    19
    20
    	public function conv($idmembre)
    	{
    		$query = $this->db->query('
    		SELECT
    			*
    		FROM
    			mps
    		WHERE
    			id_destinataire = '.$this->session->userdata('user_id').' AND id_expediteur = '.$idmembre.'
    			AND id_destinataire = '.$idmembre.' AND id_expediteur = '.$this->session->userdata('user_id').'
    		ORDER BY
    			m.id_message DESC');
    		foreach ($query->result() as $obj)
    		{
    		 echo $obj->content."<br>";
    		}
    		//$tpl['file'] = 'mp_accueil';
    		//$tpl['title'] = 'Messagerie';
    		//$this->load->view('includes/template', $tpl);
    	}

  19. #19
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Alors j'ai beau essayé plusieurs combinaisons
    Soit j'obtiens un seul message
    Soit rien du tout

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 30
    Points : 6
    Points
    6
    Par défaut
    Petite new

    En fait c'était tout bête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    WHERE
                (M.id_destinataire = '.$this->session->userdata('user_id').' AND M.id_expediteur = '.$idmembre.')
                OR (M.id_destinataire = '.$idmembre.' AND M.id_expediteur = '.$this->session->userdata('user_id').')
    Du coup comment gérer l'affichage des iD et pseudo dans la boucle ? Je suis un peu perdu...
    $obj->id : Doit corresponde à l'id de l'expéditeur ou du destinataire
    $obj->username : Doit corresponde au pseudo de l'expéditeur ou du destinataire

    Voici le code complet :
    Code php : 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
    18
    19
    20
    <?php
     
            $query = $this->db->query('
            SELECT
                M.*, membres.username
            FROM
                mps M
            LEFT JOIN membres U ON U.id = M.id_expediteur
            LEFT JOIN membres U2 ON U.id = M.id_destinataire
            WHERE
                (M.id_destinataire = '.$this->session->userdata('user_id').' AND M.id_expediteur = '.$idmembre.')
                OR (M.id_destinataire = '.$idmembre.' AND M.id_expediteur = '.$this->session->userdata('user_id').')
            ORDER BY
                M.id_message DESC');
            foreach ($query->result() as $obj)
            {
             echo "Id membre: ".$obj->id." - Pseudo : ".$obj->username." - Message : ".$obj->content."<br>";
            }
     
    ?>

Discussions similaires

  1. comment récupérer le dernier argument de chaque ligne dans une liste?
    Par sth56 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 22/03/2011, 14h02
  2. Réponses: 0
    Dernier message: 02/06/2009, 15h03
  3. Réponses: 5
    Dernier message: 04/04/2008, 20h14
  4. Comment afficher chaque fiche dans la barre des taches ?
    Par HASSANAIT dans le forum Composants VCL
    Réponses: 2
    Dernier message: 21/08/2005, 03h13

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