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

 MySQL Discussion :

trier une liste alphabétiquement et par sa première lettre


Sujet :

MySQL

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut trier une liste alphabétiquement et par sa première lettre
    y'a til une instruction mysql qui permette de faire directement la chose suivante ou bien faut t'il obligatoirement passé par php

    j'ai une page qui affiche une liste de nom d'une table dans l'ordre alphabétique

    je voudrais que cette liste soit trié par la première lettre des nom affichés et qu'à chaque changement de la première lettre du mot il saute une ligne

    exemple la liste suivante

    abricot
    allemand
    courage
    cuisine
    fripouille
    grimaud
    goéland
    donnerait

    abricot
    allemand

    courage
    cuisine

    fripouille

    grimaud
    goéland
    merci

  2. #2
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Quand tu dis TRIER, je suppose que tu veux dire CLASSER, RANGER dans un ordre précis, ORDONNER.
    Ça, ORDER BY LEFT(liste,1), le fera très bien.
    Quant au saut de ligne, c'est de la cosmétique de mise en page, PHP gèrera ça très bien en lui faisant tester la rupture sur la première lettre.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut
    effectivement je voulais dire ranger dans un ordre précis

    en fait je crois que qu'il faut que je regarde plutôt du coté de php pour faire ça

    j'aurais par exemple un menu fait des 26 lettres de l'alphabet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for($i=65;$i<91;$i++){	echo "<a href=\"?variable=".chr($i)."\">
    <strong>".chr($i)."</strong></a>|";
    quant on click par exemple sur la lettre A il va m'afficher les mots commençant par A

    mais je vais poster un message dans ce sens sur le forum php

    encore merci Maljuna

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par serna Voir le message
    quant on click par exemple sur la lettre A il va m'afficher les mots commençant par A
    Dans ce cas, on n'est plus dans le tri ni dans la cosmétique, mais dans le filtrage !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT blabla
    FROM blabla
    WHERE nom like 'A%'
    ORDER BY nom

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par Antoun Voir le message
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT blabla
    FROM blabla
    WHERE nom like 'A%'
    ORDER BY nom
    Euh....
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE UPPER(nom) like 'A%'
    non ?

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par Maljuna Kris Voir le message
    pas forcément, les collations par défaut sont insensibles à la casse, et comme vous n'avez pas soulevé le problème avec le ORDER BY, j'ai supposé qu'il ne se posait pas.

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut
    merci à vous deux, très intéressant.


    donc si je voulais utiliser ce menu

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FOR($i=65;$i<91;$i++){	echo "<a href=\"?variable=".chr($i)."\">
    <strong>".chr($i)."</strong></a>|";
    avec l'instruction mysql

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT blabla
    FROM blabla
    WHERE nom LIKE 'A%'
    ORDER BY nom


    je ferais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT blabla
    FROM blabla
    WHERE nom LIKE '.variable.%'
    ORDER BY nom
    est ce correct au niveau de la syntaxe et et ce que ça peut fonctionner ?
    le but étant d'indiquer dynamiquement la première lettre à l'instruction mysql
    selon la lettre cliqué.

    merci

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    je dirais plutôt (en PHP, pour être précis avec les quotes et autres subtilités) :

    Code PHP : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "SELECT blabla
    FROM blabla
    WHERE nom LIKE '$variable%'
    ORDER BY nom" ;

  9. #9
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut
    merci

    je vais voir plutôt du coté de php comment trier à l'affichage le résultat d'une requet ( affichage de nom et de numéro de série )

    en effet j'ai donc une page de lien ( toto.php?numseri=1, toto.php?numseri=2,toto.php?numseri=3, etc...)

    quand je clique sur toto.php?numseri=1 j'ai donc l'affichage d'une liste de nom dont le numéro de série commence par 1 grâce à la requet de type

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM table WHERE numseri LIKE  %s ORDER BY nom ASC
    comme il risque d'y avoir beaucoup de nom affiché j'ai une barre de menu en php constitué avec le script

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    FOR($i=65;$i<91;$i++){	echo "<a href=\"?variable=".chr($i)."\">
    <strong>".chr($i)."</strong></a>|";
    c'est là qu'il faut que je place un script pour lorsque on clique par exemple sur la lettre A ça n'affiche que les mots commençant par A

    peut être avec quelque chose du type

    if(isset($_GET['variable']

    mais je vais poster ça sur le forum php

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Je ne comprends pas pourquoi tu veux trier côté PHP alors que c'est bcp plus efficace côté MySQL.

    Par ailleurs, je ne suis pas sûr de vraiment comprendre ta requête-type. Que représente %s ?

  11. #11
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut
    j'ai une page titi.php avec dedans des liens qui vont afficher les nom sur la page toto.php.

    sur titi.php j'ai par exemple le lien 1 ,ça va m'afficher sur toto.php?numseri=1 tous les nom dont le numéro de série commence par 1

    mais il y'en a beaucoup , donc sur cette page toto.php j'aimerais avoir un menu composé des 26 lettres de l'alphabet. Quant je clique sur la lettre A ça m'affiche les noms dont les numéros de série commencent par 1 ET qui commence par A.
    pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM TABLE WHERE numseri LIKE  %s ORDER BY nom ASC
    ça veut dire sélectionner les nom dont le numéro de série commence par le caractère entré dans l'url

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    je vais poser la question autrement... j'imagine que ton %s est un marqueur que tu renseignes par un sprintf... qu'est-ce que tu mets dedans ?

  13. #13
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut
    voici la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    mysql_select_db($database_toto, $toto);
    $query_toto = sprintf("SELECT * FROM table WHERE numseri LIKE  %s ORDER BY nom ASC", GetSQLValueString($colname_toto . "%", "text"));
    $query_limit_toto = sprintf("%s LIMIT %d, %d", $query_toto, $startRow_toto, $maxRows_toto);
    $toto = mysql_query($query_limit_toto, $toto) or die(mysql_error());
    $row_toto = mysql_fetch_assoc($toto);

  14. #14
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    ok...

    1/ si tu fais un echo $query_limit_toto juste avant ton mysql_query, qu'est-ce que ça donne ?

    2/ ça n'est pas un peu casse-gueule de réutiliser la variable $toto pour le résultat du mysql_query, alors qu'auparavant c'est l'identifiant de connexion ?

    3/ je relis tes messages, et je ne comprends toujours pas ce qui doit être un tri (ORDER BY) et ce qui doit être un filtre (WHERE)... en particulier, je crois comprendre que tu veux les numseri qui commencent à la fois par A et par 1 ???

  15. #15
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut
    1) : cela donne ( dans le cas ou j'ai cliqué sur les numéros qui commencent par 52 )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM table WHERE numseri LIKE '52%' ORDER BY nom ASC LIMIT 0, 3000
    2) pour l'identifiant il est différent dans la vrai page, j'ai fait une erreur dans ma page d'exemple

    3) oui c'est ça

    dans un premier temps je clique sur la page titi.php avec des liens qui sont des numéros

    ça ouvre une page toto.php avec la liste des nom qui ont un numéro qui commence par le numéro clické sur la page titi.php

    ce que je voulais faire c'est ne pas afficher tout de suite toute la liste mais avoir une barre de liens qui va de A à Z et ce n 'est que l'orque l'on clique sur l'une des lettres que l'on a les nom qui commencent par la lettre cliquée et seulement eux

    j'ai trouvé une autre solution en php différente qui fait appel a des liens avec des ancres

    http://www.developpez.net/forums/d95...dynamique-php/

    mais j'aurais préféré ma première recherche

    encore merci

  16. #16
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par Antoun
    en particulier, je crois comprendre que tu veux les numseri qui commencent à la fois par A et par 1 ???
    Citation Envoyé par serna
    oui c'est ça
    Ça y est, j'ai compris. En fait ce que tu veux c'est que le numseri commence par 1 et que le nom commence par A.

    Voici ce que je te propose : sur toto.php, la liste de lettres doivent porter des liens vers toto.php?lettre=A.

    Quand on charge toto.php, tu as deux cas de figure :

    Si $_POST['lettre'] n'existe pas, tu affiches seulement la barre de lettres.

    Si $_POST['lettre'] existe, tu lances la requête suivante, et tu affiches les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT * 
    FROM TABLE 
    WHERE numseri LIKE '52%' AND nom LIKE 'A%'
    ORDER BY nom ASC

  17. #17
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut
    Ça y est, j'ai compris. En fait ce que tu veux c'est que le numseri commence par 1 et que le nom commence par A.
    pas tout à fait , ce que je souhaiterais c'est :

    si sur titi.php je clique sur le lien "1" dans toto.php j'aurais une barre de liens avec des lettres et si je clique sur par exemple la lettre A , j'aurais tous les numserie qui commence par 1 et qui ont pour première lettre de leur nom la lettre A.

    désolé si je ne suis pas très claire.

  18. #18
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    Citation Envoyé par serna Voir le message
    pas tout à fait , ce que je souhaiterais c'est :

    si sur titi.php je clique sur le lien "1" dans toto.php j'aurais une barre de liens avec des lettres et si je clique sur par exemple la lettre A , j'aurais tous les numserie qui commence par 1 et qui ont pour première lettre de leur nom la lettre A.
    C'est bien ce que je voulais dire. Est-ce que ma proposition te convient ?

  19. #19
    Membre habitué
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    412
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 412
    Points : 145
    Points
    145
    Par défaut
    Merci

    j'ai fait sur la page toto.php ceci

    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
    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
     <?php
     
    $maxRows_record = 3000;
    $pageNum_record = 0;
    if (isset($_GET['pageNum_record'])) {
      $pageNum_record = $_GET['pageNum_record'];
    }
    $startRow_record = $pageNum_record * $maxRows_record;
     
    $var_record = "-1";
    if (isset($_GET['numseri'])) {
      $var_record = (get_magic_quotes_gpc()) ? $_GET['numseri'] : addslashes($_GET['numseri']);
    }
    mysql_select_db($database_acces, $acces);
    $query_record = sprintf("SELECT * FROM table WHERE numseri LIKE %s  AND nom LIKE 'A%'
     ORDER BY nom ASC", GetSQLValueString($var_record . "%", "text"));
    $query_limit_record = sprintf("%s LIMIT %d, %d", $query_record, $startRow_record, $maxRows_record);
    $record = mysql_query($query_limit_record, $acces) or die(mysql_error());
    $row_record = mysql_fetch_assoc($record);
     
    if (isset($_GET['totalRows_record'])) {
      $totalRows_record = $_GET['totalRows_record'];
    } else {
      $all_record = mysql_query($query_record);
      $totalRows_record = mysql_num_rows($all_record);
    }
    $totalPages_record = ceil($totalRows_record/$maxRows_record)-1;
     
     
    if(!empty($_GET['lettre'])) {
            echo "pas de menu";
        }
     else {
        for($i=65;$i<91;$i++){	echo "<a href=\"#".chr($i)."\">
    <strong>".chr($i)."</strong></a>|";
    } 
     
    } 
     
    $prems_lettre='1';
    while ($res = mysql_fetch_assoc($record))
    {
       if(strtolower($res['nom'][0])!= $prems_lettre)
       {
    $prems_lettre = strtolower($res['nom'][0]);
     
    echo '<a name="'.strtoupper($prems_lettre).'">';
          echo "<br />";
          echo '<b>- ',strtoupper($prems_lettre),'</b>';
    	  echo  "</a>";
    	  echo "<br />";
     
          $prems_lettre = strtolower($res['nom'][0]);
       }
     
         echo "<a href=\"#\">".$res['nom']."</a>";
         echo "<br />";
     
    }
     
    ?>

    en envoyant dans l'url toto.php?lettre=A. il met ce code d'erreur

    Warning: sprintf() [function.sprintf]: Too few arguments in toto.php on line 47
    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 'LIMIT 0, 3000' at line 1

  20. #20
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 284
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 284
    Points : 11 737
    Points
    11 737
    Par défaut
    et si tu mettais un petit %s à la place de A ?

Discussions similaires

  1. [AC-2007] Trier une liste de valeur par odre alphabétique
    Par Samy-DT dans le forum IHM
    Réponses: 3
    Dernier message: 06/05/2014, 01h11
  2. Réponses: 5
    Dernier message: 03/01/2008, 16h07
  3. trier une liste par colonnes
    Par Sniper37 dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 26/10/2007, 10h19
  4. Trier une liste de tuples par le nième élément de tuples
    Par vdumont dans le forum Général Python
    Réponses: 2
    Dernier message: 04/05/2007, 20h45
  5. trier une liste de répertoire par date de création
    Par airod dans le forum Général Python
    Réponses: 9
    Dernier message: 10/12/2006, 20h17

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