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 :

Requête "Suivant" "Précédent"


Sujet :

Requêtes MySQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Requête "Suivant" "Précédent"
    Bonjour,

    Je bloque sur une requête, j’ai un site qui possède une messagerie et dans cette messagerie il y a l’affichage des mails (Expéditeur ou destinataire, date et objet) par page (15 par pages) et l’affichage des mails a l’unité une fois que l’on clique sur un de ces mails.
    J’ai ajoute les flèches suivante et précédente dans l’affichage des mails à l’unité : en gros quand on clique sur la flèche de gauche le mail précèdent est affiché et quand on clique sur la flèche de droite le mail suivant est affiché. Je n’ai besoin que de l’ID du mail et L’ID du membre a qui appartient la messagerie pour faire cela.
    Voici les deux requêtes pour les messages reçues de membre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT IdMessages_R FROM messages_r WHERE IdMessages_R = (SELECT MAX (IdMessages_R) FROM messages_r WHERE IdMessages_R < $idM_r) AND IdMembre = $IdMembre ;
     SELECT IdMessages_R FROM messages_r WHERE IdMessages_R = (SELECT MIN(IdMessages_R) FROM messages_r WHERE IdMessages_R > $idM_r) AND IdMembre = $IdMembre ;
    Ces requêtes me renvoient les ID existant inférieur ou supérieur à celui du message que je lis actuellement ($idM_r). $IdMembre est L’ID du membre. Cela fonctionne mais… ma requête est incomplète et bug à un certain point.


    Nom : SQL ID.jpg
Affichages : 111
Taille : 21,3 Ko


    A partir du mail reçu 57 la flèche précédente me renvoie bien au mail reçue 56 puis 55. Normalement la flèche précédente devrait sauter le mail reçu 54 et trouver le mail reçu 53 mais la requête SQL ne retourne rien. Quand L’IdMembre est diffèrent la requête ne fonctionne plus, elle n’arrive pas à me donner le prochain IDMessage_R existant avec comme IdMembre celui que je recherche.
    Aurait vous une solution à me proposer

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 106
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 106
    Points : 28 393
    Points
    28 393
    Par défaut
    Il faut intégrer la restriction sur l'IdMembre dans la sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT IdMessages_R FROM messages_r WHERE IdMessages_R = (SELECT MAX(IdMessages_R) FROM messages_r WHERE IdMessages_R < $idM_r AND IdMembre = $IdMembre) ;
    Tu pourrais récupérer les identifiants de message suivant et précédent pour tous les membres en une seule requête :'
    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  cur.IdMembre
        ,   cur.IdMessages_R        AS  IdMsg_Courant
        ,   cur.*                   --  Toute autre info sur le message courant
        ,   MIN(svt.IdMessages_R)   AS  IdMsg_Suivant
        ,   MAX(prc.IdMessages_R)   AS  IdMsg_Precedent
    FROM    messages_r  cur --  courant
        LEFT JOIN
            messages_r  svt --  suivant
            ON  svt.IdMessages_R    > cur.IdMessages_R
            AND svt.IdMembre        = cur.IdMembre
        LEFT JOIN
            messages_r  prc --  précédent
            ON  prc.IdMessages_R    > cur.IdMessages_R
            AND prc.IdMembre        = cur.IdMembre
    GROUP BY cur.IdMembre
        ,   cur.IdMessages_R        
        ,   cur.*                   --  Toute autre info sur le message courant
    ;

  3. #3
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 950
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 950
    Points : 5 849
    Points
    5 849
    Par défaut
    $idM_r = 55
    $IdMembre = 59
    (SELECT MAX (IdMessages_R) FROM messages_r WHERE IdMessages_R < $idM_r) = 54

    => where IdMessages_R = 54
    and IdMembre = 59

    => Pas de ligne sélectionnée

    En fait la requête n'a pas besoin de sous requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT max(IdMessages_R) 
      FROM messages_r 
     WHERE IdMessages_R < $idM_r 
       AND IdMembre = $IdMembre ;
     
    SELECT min(IdMessages_R) 
      FROM messages_r 
     WHERE IdMessages_R  > $idM_r 
       AND IdMembre = $IdMembre ;

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Merci
    Je teste vos deux solutions de suite et je vous fait mon retour.
    Merci pour vos réponses

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 14
    Points : 6
    Points
    6
    Par défaut Merci encore
    je viens de tester ces requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     SELECT MAX(IdMessages_R) AS idM_p FROM messages_r WHERE IdMessages_R < $idM AND IdMembre = $IdMembre; 
     SELECT MIN(IdMessages_R) AS idM_s FROM messages_r WHERE IdMessages_R > $idM AND IdMembre =  $IdMembre;
    Et elle fonctionne parfaitement.

    j'ai aussi tester la requête de al1_24 avec LEFT JOIN et elle fonctionne aussi mais elle demande a ce que je fasse des modifications en PHP et mon manager ne veut pas donc je vais rester sur la requête de skuatamad.
    En tous cas merci a vous deux.

  6. #6
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 462
    Points : 19 449
    Points
    19 449
    Par défaut
    Salut Garnner.

    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
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    --------------
    SET AUTOCOMMIT = 0
    --------------
     
    --------------
    START TRANSACTION
    --------------
     
    --------------
    DROP DATABASE IF EXISTS `base`
    --------------
     
    --------------
    CREATE DATABASE `base`
        DEFAULT CHARACTER SET `latin1`
        DEFAULT COLLATE       `latin1_general_ci`
    --------------
     
    --------------
    DROP TABLE IF EXISTS `messages_r`
    --------------
     
    --------------
    CREATE TABLE `messages_r`
    ( `idMessages_r`  integer unsigned NOT NULL auto_increment primary key,
      `idMembre`      integer unsigned NOT NULL,
      `Date`          date             NOT NULL
    ) ENGINE=InnoDB
      DEFAULT CHARSET=`latin1` COLLATE=`latin1_general_ci`
      ROW_FORMAT=COMPRESSED
    --------------
     
    --------------
    insert into `messages_r` (`idMessages_r`,`idMembre`,`Date`) values
      (57, 59, '2016-08-29'),
      (56, 59, '2016-08-29'),
      (55, 59, '2016-08-29'),
      (54, 58, '2016-08-29'),
      (53, 59, '2016-08-29'),
      (52, 57, '2016-08-29')
    --------------
     
    --------------
    select * from messages_r
    --------------
     
    +--------------+----------+------------+
    | idMessages_r | idMembre | Date       |
    +--------------+----------+------------+
    |           52 |       57 | 2016-08-29 |
    |           53 |       59 | 2016-08-29 |
    |           54 |       58 | 2016-08-29 |
    |           55 |       59 | 2016-08-29 |
    |           56 |       59 | 2016-08-29 |
    |           57 |       59 | 2016-08-29 |
    +--------------+----------+------------+
    --------------
    set @idM_r    = 57
    --------------
     
    --------------
    set @IdMembre = 59
    --------------
     
    --------------
    set @idM_r = (select max(idMessages_r) from messages_r where IdMessages_r < @idM_r and idMembre = @IdMembre)
    --------------
     
    --------------
    select @idM_r
    --------------
     
    +--------+
    | @idM_r |
    +--------+
    |     56 |
    +--------+
    --------------
    set @idM_r = (select max(idMessages_r) from messages_r where IdMessages_r < @idM_r and idMembre = @IdMembre)
    --------------
     
    --------------
    select @idM_r
    --------------
     
    +--------+
    | @idM_r |
    +--------+
    |     55 |
    +--------+
    --------------
    set @idM_r = (select max(idMessages_r) from messages_r where IdMessages_r < @idM_r and idMembre = @IdMembre)
    --------------
     
    --------------
    select @idM_r
    --------------
     
    +--------+
    | @idM_r |
    +--------+
    |     53 |
    +--------+
    --------------
    set @idM_r    = 51
    --------------
     
    --------------
    set @IdMembre = 59
    --------------
     
    --------------
    set @idM_r = (select min(idMessages_r) from messages_r where IdMessages_r > @idM_r and idMembre = @IdMembre)
    --------------
     
    --------------
    select @idM_r
    --------------
     
    +--------+
    | @idM_r |
    +--------+
    |     53 |
    +--------+
    --------------
    set @idM_r = (select min(idMessages_r) from messages_r where IdMessages_r > @idM_r and idMembre = @IdMembre)
    --------------
     
    --------------
    select @idM_r
    --------------
     
    +--------+
    | @idM_r |
    +--------+
    |     55 |
    +--------+
    --------------
    set @idM_r = (select min(idMessages_r) from messages_r where IdMessages_r > @idM_r and idMembre = @IdMembre)
    --------------
     
    --------------
    select @idM_r
    --------------
     
    +--------+
    | @idM_r |
    +--------+
    |     56 |
    +--------+
    --------------
    COMMIT
    --------------
     
    --------------
    SET AUTOCOMMIT = 1
    --------------
     
    Appuyez sur une touche pour continuer...
    La solution proposé par skuatamad fonctionne très bien, mais n'est pas adapté à ce que vous cherchez à faire !
    Pourquoi ? Car vous avez trop d'accès à MySql alors que ce n'est pas nécessaire.

    Comment faire ? En deux temps :

    1) faire une seule extraction en fixant votre membre "idMembre = @IdMembre.
    Pour la requête SQL, elle est très simple à faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from messages_r where idMembre = @IdMembre;
    Bien sûr, cela va se faire en php.
    Le résultat retourné par la requête est sous la forme d'un tableau mémoire.

    2) créer un curseur php afin d'aller en avant ou en arrière.
    Chaque ligne du tableau est indexée par un numéro désignant le rang.
    Il suffit alors de parcourir ce tableau en avant ou en arrière, en tenant compte du rang minimum qui est 1 et du maximum qui est N.
    Ce N se calcule à partir d'une fonction php, genre mysqli_num_rows.

    Le mieux est de poser la question dans le forum consacré à php.

    @+

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

Discussions similaires

  1. [MySQL] Boutons : suivant, précédent
    Par achos dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/02/2007, 17h48
  2. Résultat de requête suivant l'appartenance à un groupe
    Par electrosat03 dans le forum Access
    Réponses: 5
    Dernier message: 18/01/2007, 21h35
  3. Réponses: 2
    Dernier message: 10/01/2007, 17h28
  4. [MySQL] Comment faire pour avoir un lien sur les pages suivantes/précédentes
    Par Meewix dans le forum PHP & Base de données
    Réponses: 13
    Dernier message: 21/10/2006, 09h32
  5. [Dates] calendrier mois suivant, précédent
    Par t-die dans le forum Langage
    Réponses: 7
    Dernier message: 22/12/2005, 14h22

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