Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete : sortir l'enregistrement suivant

Sujet résolu
    20 janvier 2011 à 9:53:10

    Bonjour,

    Je cherche à faire une requete. par exemple, la table suivante :
    (id, nom, prenom)
    1 - DUPONT - Jean
    2 - ALBERT - Eric
    3 - DUPRES - Giselle
    4 - FONTAINE - Olivier
    5 - LAMBER - Jerome

    j'affiche par défaut le premier enregistrement (tri par nom, puis prénom). Et je veux donner la possibilité avec deux flèches d'afficher l'enregistrement précédent ou suivant (toujours trié par nom).
    Donc si mon premier tableau affiche l'enregistrement "ALBERT Eric", en cliquant sur suivant, je veux afficher "DUPONT Jean"

    Pour l'affichage du premier je fais :
    <?php
    $req = mysql_query("SELECT * FROM matable ORDER BY nom ASC, prenom ASC LIMIT 1");
    $result = mysql_fetch_assoc($req);
    ?>
    <form action="" method="post">
      <input type="hidden" name="id" value="<?php $result['id']; ?>" />
      <input type="submit" name="precedent" value="PRECEDENT" />
      <input type="submit" name="suivant" value="SUIVANT" />
      <?php echo $result['nom'].' '.$result['prenom']; ?>
    </form>
    

    Si c'était dans l'ordre de l'id, j'incrémenterai 1 lorsqu'on appuis sur suivant :
    <?php
    if(isset($_POST['suivant']))
    {
    $id = $_POST['suivant'];
    $nouvel_id = $id++;
    $req = mysql_query("SELECT * FROM matable WHERE id = '".$nouvel_id."' ");
    }
    ?>
    

    (en simplifiant...)

    Mais pour afficher dans l'ordre des noms puis prénoms ?

    Je sèche...

    Merci par avance !!


    • Partager sur Facebook
    • Partager sur Twitter
      20 janvier 2011 à 12:09:36

      Il faut un critère unique donc (nom,prenom) ne convient pas, on va utiliser (nom,prenom,id) pour avoir un ordre même sur les homonymes.

      Donc, tu affiches (nom,prenom,id) et tu veux le suivant :

      SELECT * FROM bla WHERE (nom,prenom,id) > ($nom,$prenom,$id) ORDER BY nom,prenom,id LIMIT 1
      


      Pour aller dans l'autre sens, remplace > par <
      • Partager sur Facebook
      • Partager sur Twitter
        20 janvier 2011 à 14:20:45

        Merci,

        j'ai bien crée ma requete en fonction de ton code.

        J'ai donc fait :
        <?php
        $req = mysql_query("SELECT * FROM individus WHERE 
        		(individus_nom,individus_prenom,individus_id) > ($individus_nom,$individus_prenom,$individus_id)
        		ORDER BY individus_nom,individus_prenom,individus_id LIMIT 1");
        $result= mysql_fetch_assoc($req);
        
        $nouvel_id = $result['individus_id'];
        // et ensuite afficher le contenu de l'enregistrement...
        ?>
        


        Cependant ça ne fonctionne pas. J'ai le message d'erreur suivant :

        Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in etc, etc...

        :( une idée ?
        • Partager sur Facebook
        • Partager sur Twitter
          20 janvier 2011 à 15:06:20

          Vérification :

          mysql> CREATE TABLE foo (nom TEXT, prenom TEXT, id INTEGER PRIMARY KEY AUTO_INCREMENT);
          Query OK, 0 rows affected (0.29 sec)
          
          mysql> INSERT INTO foo (nom,prenom) VALUES ('a','a'),('a','a'), ('a','b'),('d','h');
          Query OK, 4 rows affected (0.04 sec)
          Records: 4  Duplicates: 0  Warnings: 0
          
          mysql> SELECT * FROM foo ORDER BY nom, prenom, id;
          +------+--------+----+
          | nom  | prenom | id |
          +------+--------+----+
          | a    | a      |  1 |
          | a    | a      |  2 |
          | a    | b      |  3 |
          | d    | h      |  4 |
          +------+--------+----+
          4 rows in set (0.00 sec)
          
          mysql> SELECT * FROM foo WHERE (nom,prenom,id) > ('a','b','3') ORDER BY nom,prenom,id LIMIT 1;
          +------+--------+----+
          | nom  | prenom | id |
          +------+--------+----+
          | d    | h      |  4 |
          +------+--------+----+
          1 row in set (0.05 sec)
          


          Tu devrais afficher les erreurs après mysql_query, tu verrais que tu as oublié les '...
          • Partager sur Facebook
          • Partager sur Twitter
            20 janvier 2011 à 15:59:47

            Super, ça marche :)

            merci beaucoup !!!

            par contre, avant de marquer le sujet résolu, pour eviter que l'on recule indefiniment (une fois le premier enregistrement passé) ou que l'on depasse le dernier y'a t'il une astuce simple ?

            Je ne trouve pas la logique, suivant cette methode de tri...

            merci par avance
            • Partager sur Facebook
            • Partager sur Twitter
              20 janvier 2011 à 16:08:48

              Tu peux compter combien de résultat renvoi ta requête :
              si tu en as un alors c'est que tu n'es pas à l'une des extrémités
              sinon c'est que tu es sur le premier ou le dernier

              Pour ce faire, tu peux utiliser la fonction mysql_num_rows
              • Partager sur Facebook
              • Partager sur Twitter
                20 janvier 2011 à 16:40:49

                tout simplement...
                comme quoi il est utile de demander quand on tourne en rond, au lieux de faire des tas de requêtes inutiles parce qu'on a pas la logique... ^^

                ça marche super !

                Merci Angelo et Lord Casque Noir :)
                • Partager sur Facebook
                • Partager sur Twitter
                  22 janvier 2011 à 13:31:17

                  bonjour,
                  j'ai testé l'intéressante solution proposée et regardé avec EXPLAIN.
                  Parce qu'elle me titillait depuis longtemps vu qu'en Java-SWING et en VB .NET elle est courante et facile à mettre en oeuvre avec des scrollables cursors.
                  Mais en PHP-MySQL elle semble poser quelques petits problèmes.
                  Pour > sans index sur nom+prenom+id le nombre de "rows" manipulées est égal au "reste" de la table. Bien sûr le limit 1 te permets de récupérer au final une seule ligne.
                  Avec l'index rows d'explain renvoie 1.

                  Pour < il faut en + ORDER BY ... DESC.

                  PS : j'avais examiné il y a quelques temps les scrollables cursors en PHP-PDO qui fonctionnent avec MSS (bogués en MySQL, en Oracle, pour les autres SGBDR je ne connais pas). De tt façons dans une appli WEB-PHP c'était limite.

                  Je verrais plutôt une solution PHP-JS avec un tableau. Cela dépend de la taille de la table. Elle permet d'éviter de multiples A/R vers le serveur.

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Requete : sortir l'enregistrement suivant

                  × 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