Partage
  • Partager sur Facebook
  • Partager sur Twitter

Sélectionner les éléments directement voisins d'un SELECT

    17 février 2012 à 15:38:38

    Bonjour ,

    Afin de proposer la lecture du message suivant ou précedent dans la partie messagerie->lecture du message du site que je développe je cherche à sélectionner l'élément directement voisin inférieur ou directement voisin supérieur d'un select qui pointe un résultat unique

    j'ai une table comme celle-ci qui pour l'exemple contient des messages de 128 caractères

    CREATE TABLE `TABLETEST` (
      `ID` int(11) NOT NULL auto_increment,
      `IDMESS` int(11) NOT NULL,
      `TO` varchar(40) NOT NULL default '',
      `AUTEUR` varchar(40) NOT NULL default '',
      `MSG` varchar(128) NOT NULL default '',
      `QUAND` timestamp NOT NULL default CURRENT_TIMESTAMP,
      KEY `ID` (`ID`)
    );
    


    Je peux faire cette requête

    SELECT `ID` FROM `TABLETEST` WHERE `IDMESS`=3 AND `TO`='moi'
    


    le couple IDMESS,TO étant unique cette requête me retourne , si l'enregistrement n'a pas été supprimé,un seul résultat ,
    même si ça sert à rien je peux ajouter un ORDER BY sur la colonne IDMESS ,MSG et QUAND ordonné en ASC ou DESC


    pour avoir par exemple comme requête

    SELECT `ID` FROM `TABLETEST` WHERE `IDMESS` =3 AND `TO`='moi'
    ORDER BY `IDMESS` ASC
    


    J'aimerais pouvoir faire une requête du genre

    SELECT `ID` FROM `TABLETEST` WHERE `IDMESS` NEXT 3 AND `TO`='moi'
    ORDER BY `IDMESS` ASC
    


    afin d'avoir l'élément directement supérieur ou l'élément directement inférieur

    malheureusement dans ce contexte NEXT ,PREV ,AFTER ou BEFORE ne sont pas des mots clef valides de MySql

    mais peut être existe t-il une syntaxe spéciale pour arriver à ce résultat

    Merci pour vos conseils

    Edit : J'ai trouvé la bonne requête ,j'ai effacé mon dernier message donc je ne peux pas re poster à la suite avant 24 heures ,
    je compléterais demain le post
    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2012 à 16:34:20

      Salut

      J'ai trouvé un sujet qui ressemble fortement à ta question :
      http://www.siteduzero.com/forum-83-447 [...] recedent.html
      • Partager sur Facebook
      • Partager sur Twitter
        18 février 2012 à 23:46:25

        Merci pour ta réponse

        Avec un tri sur le temps j'ai résolu le problème à peu près dans le même esprit

        Précédent de l 'IDMESS = 6

        SELECT `IDMESS` FROM `TABLETEST` where `TO`='moi' AND `IDMESS` <> 6 
        AND `QUAND` < (SELECT `QUAND` FROM `TABLETEST` WHERE `IDMESS`=6 AND `TO`='moi')
        ORDER BY `QUAND` DESC LIMIT 1
        


        Suivant de l 'IDMESS = 6

        SELECT `IDMESS` FROM `TABLETEST` where `TO`='moi' AND `IDMESS` <> 6
        AND `QUAND` > (SELECT `QUAND` FROM `TABLETEST` WHERE `IDMESS`=6 AND `TO`='moi')
        ORDER BY `QUAND` ASC LIMIT 1
        


        J'ai adapté à mon code et ça me semble fiable bien que je pressent un cas de figure qui pourrait être bancal
        • Partager sur Facebook
        • Partager sur Twitter
          20 février 2012 à 9:35:13

          En fait des que les auteurs ou les msg ou les dates sont en double ça boucle ,ce qui est normal ,

          Alors du coup ce que j'ai fais ,qui est un mixte php MySql

          Quand l'utilisateur lit un message je vérifie l'existence d'un fichier ("s_$pseudo.txt") qui contient 3 array à consulter

          - Les ids du message triées sur l'auteur
          - Les ids du message triées sur le titre
          - les ids du message triées sur la date

          Si le fichier n'existe pas je le crée à partir de 3 requêtes mySql

          En cas d'insertion d'un message , de suppression je supprime ce fichier ce qui force la réécriture/maj à la prochaine consultation d'un message

          Ça fonctionne impeccable mais je suis un peu contrarié d'employer ce système ,je trouve ça un peu lourd et peut être y a-t-il plus simple en MySql ?

          Merci pour vos remarques ,suggestions etc ...
          • Partager sur Facebook
          • Partager sur Twitter
            21 février 2012 à 21:58:57

            salut,

            pourquoi ne pas selectionner tes 3 messages successifs d'un coup (a l'aide de order by et limit etc)?

            tu parcours ensuite tes resultats :
            1ere ligne : tu affiche le lien vers le message precedent
            2eme ligne : tu affiche le message voulu
            3eme ligne : tu affiche le lien vers le message suivant

            peut etre que ca reglerait ton souci

            c'est un peu le principe des affichages page par page
            • Partager sur Facebook
            • Partager sur Twitter
              22 février 2012 à 15:20:19

              Salut ,

              Pour moi le problème de cet affichage qui pourrait être un affichage page par page c'est de savoir ou il commence

              J'ai cette table

              ID IDMESS TO AUTEUR MSG QUAND V
              24 10 bibi totor msg2 2012-02-17 16:54:19
              23 8 moi totor msg7 2012-02-17 16:51:23
              22 7 moi bibi msg1 2012-02-17 16:51:21
              21 6 moi totor msg6 2012-02-17 16:50:42
              20 6 bibi totor bjour 2012-02-17 16:50:41
              19 4 bibi totor hola 2012-02-17 14:56:39
              18 3 moi totor message 9 2012-02-17 14:55:37
              17 2 lulu totor Hi 2012-02-17 14:56:14
              16 1 moi totor Salut 2012-02-17 14:56:12


              dans la page qui liste les mps reçus le client appelle cette requête ,il demande la liste triée sur la colonne 'AUTEUR'

              SELECT * FROM `TABLETEST` where `TO`='moi'
              ORDER BY `AUTEUR` ASC,`QUAND` ASC,`MSG` ASC
              


              Il obtient alors ce résultat

              ID IDMESS TO AUTEUR MSG QUAND
              22 7 moi bibi msg1 2012-02-17 16:51:21
              16 1 moi totor Salut 2012-02-17 14:56:12
              18 3 moi totor message 9 2012-02-17 14:55:37
              21 6 moi totor msg6 2012-02-17 16:50:42
              23 8 moi totor msg7 2012-02-17 16:51:23



              transformé pour le client en une liste de liens du genre

              http://www.monsite.com/mp.php?m=7
              http://www.monsite.com/mp.php?m=1
              http://www.monsite.com/mp.php?m=3
              http://www.monsite.com/mp.php?m=6
              http://www.monsite.com/mp.php?m=8

              (avec une mise en forme ,c'est à dire intégrés dans des lignes cliquables contenant l'auteur le titre et la date)

              Le client clique sur les liens pour afficher le message ce qui dans la page mp.php lance 2 requêtes pour afficher les flèches précédent suivant

              POur le Message Précédent

              SELECT `IDMESS` FROM `TABLETEST` where `TO`='moi' AND `IDMESS` <> ?
              AND `AUTEUR`<=(SELECT `AUTEUR` FROM `TABLETEST` WHERE `IDMESS`=? AND `TO`='moi')
              ORDER BY `AUTEUR` ASC,`QUAND` ASC,`MSG` ASC LIMIT 1
              


              Si je fais varier les ? De la requête préparé avec les valeur $_GET 'm' des liens 7,1,3,6,8

              j'obtiens

              Pour 7 => Rien( 7 est le premier message donc normal qu'il n y'en ai pas avant
              Pour 1 => 7
              Pour 3 => 7 (problème ,comment indiquer de façon unique où reprendre la lecture)
              Pour 6 => 7
              Pour 8 => 7

              Je ne peux pas trier sur la colonne `ID` (ils ne sont pas ordonnés)
              Je ne peux pas trier sur la colonne `IDMESS` (ils ne sont pas ordonnés)
              Je peux trier sur les `AUTEUR`(il y'a plein de doublons ce qui me renvoit toujours le même résultat ,ici 7)
              Il reste la colonne `QUAND` mais vu que je tri sur la colonne auteur elle n'est pas ordonnée

              Le problème c'est que je n'arrive pas à avoir de repère du genre LIMIT 4,3

              Il y'a peut être un moyen d'y arriver mais là excepté ma solution pour l'instant je vois pas ,
              j'ai trouvé sur le net des cas similaires mais ils n'ont pas été résolus
              • Partager sur Facebook
              • Partager sur Twitter

              Sélectionner les éléments directement voisins d'un SELECT

              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
              • Editeur
              • Markdown