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 :

Récupérer derniers messages, système de messagerie


Sujet :

Requêtes MySQL

  1. #1
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut Récupérer derniers messages, système de messagerie
    Bonjour,

    Je cherche depuis un moment mais ça ne donne rien...Voici ma relation message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    +-----------------+--------------+------+-----+---------+----------------+
    | Field           | Type         | Null | Key | Default | Extra          |
    +-----------------+--------------+------+-----+---------+----------------+
    | id              | int(11)      | NO   | PRI | NULL    | auto_increment |
    | expediteur_id   | int(11)      | YES  | MUL | NULL    |                |
    | destinataire_id | int(11)      | YES  | MUL | NULL    |                |
    | parent_id       | int(11)      | YES  | MUL | NULL    |                |
    | sujet           | varchar(255) | NO   |     | NULL    |                |
    | message         | longtext     | NO   |     | NULL    |                |
    | date            | datetime     | NO   |     | NULL    |                |
    | vu              | int(11)      | NO   |     | NULL    |                |
    | efface          | int(11)      | NO   |     | NULL    |                |
    +-----------------+--------------+------+-----+---------+----------------+
    C'est donc des messages avec des réponses possibles qui font référence à leur parent via parent_id.

    J'aimerai récupérer la dernière réponse de chaque message. Si on a par exemple:
    Parent1 possède {reponses -> rep1, rep2, rep3}
    Parent2 possède {reponses -> rep4, rep5}

    Le résultat retourné serait être :
    rep3 et rep5

    Une idée ?
    Merci!

  2. #2
    Membre éclairé Avatar de ledisciple
    Homme Profil pro
    observateur de nuage niveau 2.3
    Inscrit en
    Août 2008
    Messages
    860
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : observateur de nuage niveau 2.3

    Informations forums :
    Inscription : Août 2008
    Messages : 860
    Points : 723
    Points
    723
    Par défaut
    tu as essayé d'utiliser max() soit sur ta date ?

  3. #3
    Membre actif

    Profil pro
    Inscrit en
    Mai 2008
    Messages
    186
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2008
    Messages : 186
    Points : 234
    Points
    234
    Par défaut
    Oui mais, pour le moment j'arrive juste à récupérer quelque chose de cette forme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    +--------+----+---------------------+--------+---------------------+
    | sujet  | id | pdate               | xsujet | xdate               |
    +--------+----+---------------------+--------+---------------------+
    | coucou |  1 | 2011-04-16 10:48:35 | merci    | 2011-04-16 10:49:04 |
    | coucou |  1 | 2011-04-16 11:48:35 | ok    | 2011-04-16 11:49:37 |
    | yo     |  4 | 2011-04-16 14:45:03 | bye   | 2011-04-16 14:46:01 |
    +--------+----+---------------------+--------+---------------------+
    Avec ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select p.sujet,p.id,p.date as pdate, x.sujet as xsujet, x.date as xdate 
    from message p join message x on p.id=x.parent_id 
    where p.id or x.parent_id in 
    (select m.id from message m where m.parent_id is null);
    Il faudrait que j'arrive maintenant à extraire deux résultats:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    +--------+----+----------------
    | sujet  | date               |
    +--------+----+----------------
    | ok    | 2011-04-16 11:49:37 |
    | bye   | 2011-04-16 14:46:01 |
    +--------+----+----------------

  4. #4
    Membre expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Points : 3 295
    Points
    3 295
    Billets dans le blog
    1
    Par défaut
    Pour faire simple tu veux construire une requête hiérarchique qui va parcourir ton arborescence de message et sortir ses feuilles (les derniers)

    Certains sgbd comme Oracle implémentent ça en natif... mais pas mysql...

    L'idée est de faire une procédure stockée qui va parcourir tous tes messages de premier niveau (avec null comme parent_id) et récupérer le sujet. on utilisera un curseur pour ça. puis pour chaque id on applique une fonction stockée qui va servir pour la récursion jusqu'à la feuille de la branche et rapatrier ce que tu veux (ici la date).

    Ne pas oublier de mettre à jour la variable d'environnement mysql qui autorise le nombre de récursion et qui est à 0 de base... pour être sur autan le faire dans la procédure.

    Pour le rendu, 2 grandes façons :
    • tu ponds le résultat sous forme d'un set de résultats indépendants (1 par message trouvé).
    • Tu concatènes les résultats sous forme xml
    • Tu concatènes les résultats avec différents séparateurs pour les traiter dans une autre procédure ou en php après.


    Au fait, des identifiant en int(4) ça te donne déjà plus de 2 milliards d'entrées à savoir, soit bien plus que ce que ne permet de traiter le pauvre mysql en un temps fini... De même, longtext ça fait plus que riche car text permet déjà plus de 64000 caractères, ça fait aussi déjà un très long message...

    Les colonnes vu et efface ne sont elles pas de simples booléens plutôt que des int(11)?

    Voilà un exemple qui fait ce que tu veux ... à noter que la limite de récursion est fixée à 255 dans mysql

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    drop database if exists messagerie;
    create database messagerie default character set utf8 collate utf8_general_ci;
    use messagerie;
    create table message(
    	id						int(4) not null auto_increment,
    	expediteur_id		int(4),
    	destinataire_id	int(4),
    	parent_id			int(4),
    	sujet					varchar(255) not null,
    	message				text not null,
    	`date`				datetime not null,
    	vu						bool not null default false,
    	efface				bool not null default false,
    	constraint pk_message primary key(id),
    	key(expediteur_id,destinataire_id,parent_id)
    )engine=myisam auto_increment=1;
     
    insert into message(expediteur_id,destinataire_id,parent_id,sujet,message,`date`)values
    (1,2,null,"coucou","ça va?","2011-04-18 10:00:00"),
    (2,1,1,"re:coucou","oui et toi","2011-04-18 12:00:00"),
    (3,1,2,"re:re:coucou","moi aussi","2011-04-18 14:00:00"),
    (3,2,null,"rdv","on peut se voir quand?","2011-04-18 10:00:00");
     
    delimiter |
    create procedure last_response(in id_message int(4),out l_id int(4))
    begin
    	declare test bool;
    	declare id_m int(4);
    	select count(id)>0,id into test,id_m from message where parent_id=id_message;
    	if test then
    		call last_response(id_m,l_id);
    	else
    		set l_id=id_message;
    	end if;
    end|
    create procedure list_messages()
    begin
    	declare d datetime;
    	declare done bool default false;
    	declare i,j int(4);
    	declare s varchar(255);
    	declare lit cursor for select id,sujet,`date` from message where isnull(parent_id);
    	declare CONTINUE HANDLER for SQLSTATE '02000' set done = 1;
    	set @@session.max_sp_recursion_depth=255;
    	open lit;
    	repeat
    		fetch lit into i,s,d;
    		if not done then
    			call last_response(i,j);
    			if i=j then
    				select i as "id",s as "sujet",d as "date";
    			else
    				select i as "id",s as "sujet",d as "date",j as "rep id",m.sujet as "rep sujet",m.`date` as "rep date"
    				from message m where m.id=j;
    			end if;
    		end if;
    	until done end repeat;
    	close lit;
    end|
    delimiter ;
     
    call list_messages();

    A toi d'adapter les infos que tu veux rapatrier avec d'éventuelles jointures (left outer join) si besoin...

Discussions similaires

  1. Récupérer les 10 derniers messages par catégorie
    Par mox20 dans le forum Requêtes
    Réponses: 4
    Dernier message: 05/06/2013, 06h23
  2. [SQL] Système gestion dernier message + nombres sujets/réponses
    Par Dinan dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/02/2007, 10h09
  3. Récupérer dernier enregistrement d'une table?
    Par Invité dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 19/01/2004, 12h38
  4. Réponses: 6
    Dernier message: 30/12/2003, 18h37
  5. [TControl] Récupérer le message court et long du hint ?
    Par Cornell dans le forum Composants VCL
    Réponses: 6
    Dernier message: 19/11/2003, 09h55

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