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

Requêtes MySQL Discussion :

Existe-t-il un ORDER BY dynamique (l'ordre est déterminé par le contenu des champs)?


Sujet :

Requêtes MySQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut Existe-t-il un ORDER BY dynamique (l'ordre est déterminé par le contenu des champs)?
    Est-il possible de moduler l'ordre du tri des enregistrements selon le contenu d'un champ?

    Mon exemple est simple à comprendre : J'ai une table qui contient une liste de membres avec trois champs :

    1) Le statut du membre, un entier (1=actif, 2=à l'essai, etc.)
    2) Le prenom du membre
    3) Son adresse

    Je veux lister les membres en triant d'abord sur leur statut (i.e tous les membres actifs en premier, ensuite ceux à l'essai) puis sur leur prénom. Donc on ajoute ORDER BY statut, prenom.

    Là où cela me semble impossible est que, si une fois qu'un membre a été listé selon cet ordre, il existe un ou plusieurs autres membres habitant à la même adresse, je veux qu'ils soient listés tout de suite après, indépendamment de leur statut ou de leur prénom.

    Avez-vous une idée de comment faire?

    Un extrait de mes données :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    CREATE TABLE `membres_test` (
      `statut` smallint(5) unsigned default NULL,
      `prenom` varchar(30) default NULL,
      `adresse_1` varchar(50) default NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
     
    INSERT INTO `membres_test` (`statut`,`prenom`,`adresse_1`) VALUES 
     (1,'Gérald','560, boulevard Lasalle'),
     (1,'Henriette','395, rue Wellington'),
     (1,'Gisèle','163, rue Saint-Christophe'),
     (5,'Christiane','163, rue Saint-Christophe'),
     (1,'Marie-Denise','829, 8e Avenue'),
     (1,'Chantal','236, avenue Parkville'),
     (6,'Jean-Claude','85, rue Ponsard'),
     (5,'Sophie','85, rue Ponsard'),
     (1,'Yvonne','20, rue Léon-Grondin'),
     (1,'Rénald','44, rue Des Gaillardes'),
     (5,'Jacqueline','44, rue Des Gaillardes'),
     (1,'Suzanne','10, rue Marconi'),
     (1,'José-Anibal','28, avenue Colombier'),
     (5,'Jesus','28, avenue Colombier'),
     (1,'Halima','80, rue Mercier'),
     (5,'Ali','80, rue Mercier'),
     (1,'Kathleen','377, rue Orphée'),
     (1,'André','20, rue des Rapides'),
     (5,'Nicole','20, rue des Rapides'),
     (1,'Francine','258, rue Chapleau'),
     (1,'Réal','258, rue Chapleau'),
     (1,'Michel','201, rue Louis Veuillot #3'),
     (1,'Lucille','274, avenue Létourneux'),
     (1,'Marie-Christine','220, rue Moreau'),
     (5,'Daniel','220, rue Moreau'),
     (2,'Louise','21, rue Saint-Jacques'),
     (1,'Robert','600, rue Chevalier app. 25'),
     (1,'Monique','280, rue Saint-Charles, app. 340'),
     (1,'France','435, rue Boyer'),
     (2,'Pierre','435, rue Boyer'),
     (2,'Simon-Pierre','435, rue Boyer'),
     (1,'Yvanne','280, rue Saint-Charles, app. 224'),
     (1,'Gratien','280, rue Saint-Charles, app. 224'),
     (6,'Réjean','74, Woodland'),
     (6,'Marguerite','258, place Dublin, app. 3'),
     (6,'Suzy','16, rue Saint-Félix');

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Je pense que deux éléments sont assez fragiles :
    - il n'y a pas de clé primaire ; j'ai donc considéré artificiellement le prénom comme une clé candidate (autrement dit, qu'il n'y a jamais deux membres avec le même prénom)
    - je suppose que tes adresses sont bien normalisées...

    Ces deux réserves exprimées, je te suggère de rechercher pour chaque membre (M) ses voisins (V), chacun étant son propre voisin. Cela permet de trier sur le statut/prenom du "meilleur" voisin (celui arrivant le premier dans cet ordre de tri), ce qui devrait produire l'effet désiré.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT M.statut, M.prenom, M.adresse
    FROM membres_test M
      INNER JOIN membres_test V ON M.adresse_1 = V.adresse_1 
    GROUP BY M.statut, M.prenom, M.adresse
    ORDER BY MIN(V.statut), MIN(V.prenom), M.prenom
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Merci Antoun,

    La solution proposée fonctionne à 95%! Au moins, tous les membres avec la même adresse sont groupés, ce qui était le plus important.

    La requête donne de meilleurs résultats sans la fonction MIN dans la partie ORDER BY.

    Le seul bogue est que, pour certaines données, l'ordre d'apparition des enregistrements, lorsque l'adresse est identique, est inversé.

    Pour ce qui est de la clé primaire, les données soumises en exemple n'en avaient pas mais ma table réelle en contient une nommée id_membre. Est-ce que ça change quelque chose à la requête?

    Merci encore,

    PC

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    pour le ORDER BY sans MIN, c'est effectivement "l'optimisation du GROUP BY" propre à MySQL. Ça veut dire que si tu portes le code sur un autre SGBD que MySQL, il faudra remettre les MIN. Par ailleurs, je pense que dans certains cas ça faussera le tri...

    Pour l'id_membre, ce n'était important que dans une autre version que j'avais en tête avant de choisir celle-ci... ceci dit, on peut l'utiliser pour optimiser le GROUP BY là aussi.

    Voici deux nouvelles versions prenant en compte le tri entre voisins :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    -- en SQL normalisé
    SELECT M.statut, M.prenom, M.adresse
    FROM membres_test M
      INNER JOIN membres_test V ON M.adresse_1 = V.adresse_1 
    GROUP BY M.statut, M.prenom, M.adresse
    ORDER BY MIN(V.statut), MIN(V.prenom), M.statut, M.prenom
    
    -- optimisé pour MySQL, invalide pour les autres :
    SELECT M.statut, M.prenom, M.adresse
    FROM membres_test M
      INNER JOIN membres_test V ON M.adresse_1 = V.adresse_1 
    GROUP BY M.id_membre
    ORDER BY MIN(V.statut), MIN(V.prenom), M.statut, M.prenom
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Août 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2008
    Messages : 14
    Points : 15
    Points
    15
    Par défaut
    Avec l'ajout du M.statut comme troisième critère du ORDER BY et toujours sans la fonction "MIN", la requête fonctionne maintenant à 100%! Quand deux adresses sont identiques, elle trie d'abord sur le statut puis, en cas d'égalité, sur le nom, cqfd...

    Merci énormément pour cette aide très précieuse! C'est apprécié!

    PC

  6. #6
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    Faire sauter le MIN revient à dire à MySQL : "tu prends le premier voisin trouvé dans la table"... j'imagine qu'avec ta saisie actuelle, ça correspond à ton ordre (statut, prenom), d'où le 100% correct que tu as actuellement. Ce "100% correct" ne veut pas dire que tu sois prémuni contre les anomalies ultérieures.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

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

Discussions similaires

  1. Formulaire dynamique qui ne me renvoie pas les valeurs des champs
    Par heero37 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 20/08/2014, 12h40
  2. Problème d'order by dynamique.
    Par imagia dans le forum Reports
    Réponses: 2
    Dernier message: 20/01/2009, 18h04
  3. Soucis d'ORDER BY dynamique (CASE) dans un OVER()
    Par Danny Blue dans le forum Langage SQL
    Réponses: 2
    Dernier message: 05/04/2007, 13h53
  4. Comment faire un ORDER BY dynamique avec une direction?
    Par Danny Blue dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 25/03/2007, 01h46
  5. [Crystal report] Order BY Dynamique
    Par moimoimoi dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 26/05/2004, 17h05

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