Partage
  • Partager sur Facebook
  • Partager sur Twitter

SQL trier une ligne (et non pas une colonne

Sujet résolu
    12 septembre 2017 à 11:25:37

    Bonjour,

    Je souhaite trier ma table par colonne et non pas par ligne. Je m'explique :

    Voilà ma table

    id --- secteur_1 --- secteur_2   ---   secteur_3  --- secteur_4

    1 ---     Ilot       --- Garage      ---   Rangement --- Salle

    2 ---      Rack   --- Rangement    ---   Stock     ---   Coursive

    Traditionnellement, si je fais

    SELECT secteur_1, secteur_2, secteur_3, secteur_4 FROM table ORDER BY secteur_1 ASC


    Et j'obtiens un classement "vertical" de secteur 1.

    Mais je veux classer alphabétiquement tous mes secteurs (de 1 à 4) seulement pour la ligne : 

    SELECT secteur_1, secteur_2, secteur_3, secteur_4 FROM table WHERE id=1

    Et je bloque...

    • Partager sur Facebook
    • Partager sur Twitter
      12 septembre 2017 à 11:58:01

      Bonjour,

      Lorsque l'on commence à numéroter les noms de colonnes c'est qu'il y a un problème de conception ... du coup tu te crées des problèmes que tu ne devrais pas avoir :p

      Lorsque l'on modélise une base de données, il est toujours pertinent de faire une analyse entités/relations (cf. doc "Conception BDD" dans ma signature). Ici, je ne sais pas ce que contient ta table "table", mais imaginons que ce sont des "choses".

      Tu as donc des "choses" et des "secteurs" ce sont deux entités, donc deux tables.

      Côté relation, une "chose" peut avoir plusieurs "secteurs" (4 dans ton cas), et un "secteur" peut être lié à plusieurs "choses". C'est une relation de plusieurs à plusieurs (many to many, on n,n) qui implique la création d'une table de relation.

      Ton modèle devrait être :

      • chose ( id_chose [pk], nom_chose )
      • secteur ( id_secteur [pk], nom_secteur )
      • chose_secteur ( id_chose [pk][fk], id_secteur [pk][fk] )

      Pour lier une chose à des secteurs il faut donc créer plusieurs enregistrements dans la table chose_secteur. En reprenant les deux exemples que tu donnes, tu aurais :

      Table chose
      id_chosenom_chose
      1 Chose 1
      2 Chose 2
      Table secteur
      id_secteurnom_secteur
      1 Ilot
      2 Garage
      3 Rangement
      4 Salle
      5 Rack
      6 Stock
      7 Coursive
      Table chose_secteur
      id_choseid_secteur
      1 1
      1 2
      1 3
      1 4
      2 5
      2 3
      2 6
      2 7

      A partir de là, tu peux faire ce que tu souhaites :

      SELECT
          CS.id_chose,
          C.nom_chose,
          CS.id_secteur,
          S.nom_secteur
      FROM
          chose_secteur CS
              INNER JOIN chose C
                  ON CS.id_chose = C.id_chose
              INNER JOIN secteur S
                  ON CS.id_secteur = S.id_secteur
      WHERE CS.id_chose = 1
      ORDER BY S.nom_secteur ASC;

      -
      Edité par Benzouye 12 septembre 2017 à 12:04:04

      • Partager sur Facebook
      • Partager sur Twitter
      Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
        12 septembre 2017 à 15:12:28

        Ce que tu demandes n'es pas faisable. Pas lors du SELECT du moins.

        T'as 3 options :

        1/ Extraire tes données, les trier comme tu veux et les ré-insérer dans l'ordre voulu. Et faire attention lors de tes prochaines insertions et update de garder le tri. C'est le bordel, c'est moche, mais faisable.

        2/ Tu laisses tes données en l'état, et tu fais ton tri dans ton code par la suite juste que ce soit dans l'ordre dans ton IHM.

        3/ Change ton modèle de données.

        • Partager sur Facebook
        • Partager sur Twitter
          12 septembre 2017 à 15:29:17

          Merci

          En gros j'ai une ligne par utilisateur qui stocke 20 secteurs. C'est pourquoi j'ai monté ma table ainsi.

          Je récupère tous les secteurs pour l'utilisateur.

          Benzouye comment et pourquoi alors créer 2 tables sachant que les différents utilisateurs n'ont pas de secteur en commun.

          Sinon je récupère les secteurs pour chaque utilisateur et je fais un array en php pour faire mon tro

          Merci

          • Partager sur Facebook
          • Partager sur Twitter
            12 septembre 2017 à 15:44:06

            BenoîtDESCOURS a écrit:

            pourquoi alors créer 2 tables sachant que les différents utilisateurs n'ont pas de secteur en commun

            Dans l'exemple donné, "rangement" est sur les deux lignes ... D'où ma déduction "un secteur peut être lié à plusieurs chose" ...

            Si un même secteur n'est lié qu'à un seul et unique utilisateur, alors tu as quand même un modèle en deux tables :

            • utilisateur ( id_utilisateur [pk], etc. )
            • secteur ( id_secteur [pk], nom_secteur, id_utilisateur [fk] )

            Et pour retrouver tous les secteurs d'un utilisateur :

            SELECT S.nom_secteur
            FROM secteur S
            WHERE S.id_utilisateur = 1
            ORDER BY S.nom_secteur ASC;

            BenoîtDESCOURS a écrit:

            Sinon je récupère les secteurs pour chaque utilisateur et je fais un array en php pour faire mon tri

            Oui, c'est ce que propose Tiffado juste avant, mais c'est une mauvaise habitude que tu prends de ne pas modéliser correctement ... Chaque chose ensuite te posera problème ...

            -
            Edité par Benzouye 12 septembre 2017 à 15:45:18

            • Partager sur Facebook
            • Partager sur Twitter
            Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL
              12 septembre 2017 à 15:59:03

              Effectivement, c'est faisable, mais ca veut pas dire que c'est la meilleure des solutions ^^
              • Partager sur Facebook
              • Partager sur Twitter
                12 septembre 2017 à 17:09:35

                Ok, et merci beaucoup de vos retours.

                Si par hasard, ce sujet vous intéresse, je bloque dessus...  

                https://openclassrooms.com/forum/sujet/jointure-avec-conditions?page=1#message-91953955

                @+

                • Partager sur Facebook
                • Partager sur Twitter

                SQL trier une ligne (et non pas une colonne

                × 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