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

PHP & Base de données Discussion :

Affichage de résultats organisé suivant la première lettre [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 93
    Points : 49
    Points
    49
    Par défaut Affichage de résultats organisé suivant la première lettre
    Bonjour,

    j'aimerai changer ma manière d'afficher mes résultats de requêtes.

    Aujourd'hui, j'ai un classement alphabétique simple ou tout est à la suite.

    Aladin
    Bartabars
    Caracas
    ...

    J'aimerai faire une présentation comme celle-ci avant d'alimenter comme un fou ma base.

    http://www.superherodb.com/characters.php

    Je suppose qu'il faut faire un classement de base avec sélection sur la première lettre de l'alphabet et ainsi de suite. Cependant, n'existe t-il pas une solution plus simple pour éviter de requêter sur chaque lettre?

    Merci de votre aide

  2. #2
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    tu peux concatener et tout se fera en une requète

    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    (SELECT "A" lettre, GROUP_CONCAT(pseudo SEPARATOR " / ") FROM membre
    WHERE pseudo LIKE "a%")
    UNION
    (SELECT "B" lettre, GROUP_CONCAT(pseudo SEPARATOR " / ") FROM membre
    WHERE pseudo LIKE "b%")
    [...]
    UNION
    (SELECT "Z" lettre, GROUP_CONCAT(pseudo SEPARATOR " / ") FROM membre
    WHERE pseudo LIKE "z%")

  3. #3
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    A mon avis, c'est nécessaire de gérer l'affichage avec php.

    Ce que je ferais dans l'ordre :
    1/ requête select substr(nom, 0, 1) as initiale, nom order by initiale
    2/ mise dans un tableau de la requête
    3/ affichage avec pour chaque ligne, test si l'initiale est la même que la ligne précédente : si ce n'est pas le cas, changement de bloc d'affichage.

  4. #4
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    guiday, tu as un exemple plus "code" de ce que tu me conseilles, je débute et j'ai parfois du mal à transcrire les solutions

  5. #5
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    son code est écrit noir sur blanc

    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    SELECT SUBSTR(nom, 0, 1) AS initiale, nom 
    FROM tatable
    ORDER BY initiale;

  6. #6
    Membre éprouvé

    Inscrit en
    Janvier 2006
    Messages
    969
    Détails du profil
    Informations forums :
    Inscription : Janvier 2006
    Messages : 969
    Points : 958
    Points
    958
    Par défaut
    Je pense qu'il parlait plutôt de la 3ème partie de ma solution, malheureusement je n'en ai pas d'exemple simple sous la main (ma version fait plusieurs dizaines de lignes, mais elle gère un tas d'autres choses, et en plus elle est pro donc pas open source).

  7. #7
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    pour simplifier le php qui va suivre cette requète, je te propose de fusionner les deux requète proposées

    Code MySQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT LEFT(email,1) AS initial, 
    GROUP_CONCAT(pseudo separator '/') AS pseudo
    FROM tatable
    GROUP BY initial;

    la tu vas avoir la colonne initial, ainsi que la colonne pseudo.

    ensuite, si tu veux tout recupérer coté php :

    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
     
    $req = mysql_query("SELECT LEFT(email,1) AS initial, 
    GROUP_CONCAT(pseudo SEPARATOR '/') AS pseudo
    FROM tatable
    GROUP BY initial");
     
    while ($res = mysql_fetch_array($req)):
    //Affichage de la Lettre
    echo "<p><strong>${res['initial']}</strong><br />";
    /*Affichage des pseudo
    le mot clé SEPARATOR nous indique que les
    nom des membres sont séparés par des slash
    on va donc exploser la variable gràce à cette info!
    */
    $all_pseudo = explode("/",$res['pseudo']);
    foreach($all_pseudo as $pseudo)
         echo "$pseudo <br />";
    echo "</p>";
    endwhile;

  8. #8
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    Citation Envoyé par guidav Voir le message
    Je pense qu'il parlait plutôt de la 3ème partie de ma solution, malheureusement je n'en ai pas d'exemple simple sous la main (ma version fait plusieurs dizaines de lignes, mais elle gère un tas d'autres choses, et en plus elle est pro donc pas open source).
    En effet, désolé de m'être mal exprimé.

    Je vais tout tester et vous tiens au courant.

    Merci de vos rapides réponses.

  9. #9
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    J'ai un message d'erreur sur la ligne 17 de mon code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in /home.10.27/cloridri/www/encyclo-comics/results.php on line 17
    sachant que la page de code pour afficher ce que tu m'as indiqué est le suivant :

    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
    <?PHP
    /* Connexion a la base */
     
    /* On link sur un fichier de conf à la racine */				
    require("configCD.php");
     
    // on crée la requete SQL
    $req = mysql_query("SELECT LEFT(nickFR,1) AS initial, 
    GROUP_CONTACT(pseudo SEPARATOR '/') AS pseudo
    FROM heros
    GROUP BY initial");
     
    while ($res = mysql_fetch_array($req))
    //Affichage de la Lettre
    echo "<strong>${res['initial']}</strong><br />";
    /*Affichage des pseudo
    le mot clé SEPARATOR nous indique que les
    nom des membres sont séparés par des slash
    on va donc exploser la variable gràce à cette info!
    */
    $all_pseudo = explode("/",$res['pseudo']);
    foreach($all_pseudo as $pseudo)
         echo "$pseudo <br />";
     
    ?>
    J'ai du retirer les endwhile aussi qui générait lui auss un message d'erreur. Peut être que les deux sont liés?



    Ensuite il faut que j'intègre ce que j'avais fait auparavant sur l'affichage des données avec un ID

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    // on affiche les informations de l'enregistrement en cours
    //{
    //echo '<a href="details.php?id='.$data['id'].'">'.$data['nickFR'].'</a><br/>';
    //}

  10. #10
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    Citation Envoyé par cloridriks Voir le message
    J'ai un message d'erreur sur la ligne 17 de mon code



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?PHP
    /* Connexion a la base */
    
    /* On link sur un fichier de conf à la racine */				
    require("configCD.php");
    
    // on crée la requete SQL
    $req = mysql_query("SELECT LEFT(nickFR,1) AS initial, 
    GROUP_CONTACT(pseudo SEPARATOR '/') AS pseudo
    FROM heros
    GROUP BY initial");
     
    [...]
    remplace le pseudo en rouge par nickFR

    c'est étrange que le endwhile; ait pu créé un problème. enfin brèf, tu l'as supprimé mais tu as oublié de mettre les accolades, a la fin du while rajoute :
    {

    et rajoute } ou était placé initialement endwhile;

  11. #11
    Nouveau membre du Club Avatar de frakosun
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    Tiens, voilà mon code (et moi c'est total open source guidav.. )

    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
    //Requete
    $sql = mysql_query("SELECT champ FROM table ORDER BY champ");
     
    //Stockage de la lettre à comparer
    $alpha_prec = -1;
     
    //Boucle
    while ($res = mysql_fetch_assoc($sql))
    {
    	//On retourne la première lettre des enregistrements
            $alpha_verif = substr($res['champ'],0,1);
     
    	//Si la lettre change 
    	if ($alpha_verif!= $alpha_prec)
    	{
    	        //on ajoute le séparateur alpha
    		echo "<b>".$alpha_verif."</b><br>"; 
    	        //ainsi que le 1er enregistrement de la nouvelle lettre
    		echo "".$res['champ']."<br>";
     
    	//on enregistre la nouvelle valeur de la lettre à comparer
    	$alpha_prec = $alpha_verif;
     
           //Sinon on continue la boucle sur la lettre courante
    	} else{
    		echo "".$res['champ']."<br>";
    	} 
    }
    j'ai expliqué au maximum, ça devrait être clair^^

    On peut toujours paufiner, et regrouper les enregistrements commençant par un chiffre dans un groupe de type [0-9], ou encore afficher un "pas de résultats" quand pas d'enregistrements pour une lettre, etc.

    A chacun de modifier à sa sauce

  12. #12
    Membre du Club
    Inscrit en
    Octobre 2007
    Messages
    93
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 93
    Points : 49
    Points
    49
    Par défaut
    Parfait, merci à vous deux, ca marche impec.

  13. #13
    Membre confirmé Avatar de SphynXz
    Développeur Web
    Inscrit en
    Mars 2008
    Messages
    439
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mars 2008
    Messages : 439
    Points : 547
    Points
    547
    Par défaut
    tu alourdis ton php en lui faisant faire des fonction que MySQL sait tout aussi bien faire

    heuresement que c'est open source parce que là j'aurais pas acheté
    je taquine

    enfin une chose est sûre : ne jamais faire coté php ce que MySQL est capable de faire

  14. #14
    Nouveau membre du Club Avatar de frakosun
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    54
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Avril 2007
    Messages : 54
    Points : 38
    Points
    38
    Par défaut
    c'est toujours moins lourd que 26 requetes (une par lettre)

    trève de plaisanterie ça fait une grosse différence en temps d'exécution/affichage au final? Parce que je testerai bien ta méthode si c'est le cas. Si c'est juste pour faire bosser un peu plus mysql, il bosse déjà assez comme ça le coquin

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/06/2014, 10h22
  2. [XL-2000] Suggestion de résultat à partir des premières lettres
    Par Monfy29 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 02/12/2010, 14h15
  3. Réponses: 2
    Dernier message: 08/02/2008, 16h43
  4. Affichage du résultat
    Par thomas_strass dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/07/2005, 11h30
  5. Mettre la première lettre des mots en majuscule
    Par seb.49 dans le forum Langage
    Réponses: 8
    Dernier message: 23/05/2003, 14h26

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