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

Langage SQL Discussion :

Tri d'un arbre par représentation intervallaire


Sujet :

Langage SQL

  1. #1
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut Tri d'un arbre par représentation intervallaire
    Bonjour,

    Je cherche à trier par ordre alphabétique les éléments d'un arbre par représentation intervallaire. voir : http://sqlpro.developpez.com/cours/arborescence/

    Il paraîtrait que ce soit possible en combinant un tri entre les bornes, le niveau et le nom à l'aide d'un CASE.
    Pour ma part, je ne vois pas comment faire sans avoir à passer par une sous requête pour récupérer la borne du parent.

    Un jeu de test basé sur le tuto :

    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
    CREATE TABLE NEW_FAMILLE
    (NFM_BG  INTEGER,
     NFM_BD  INTEGER,
     NFM_NIV  INTEGER,
     NFM_LIB VARCHAR(16));
     
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (1, 22, 1, 'Transport');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (2, 21, 2, 'Aérien');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (3, 4, 3, 'Planeur');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (5, 6, 3, 'Parachute');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (7, 8, 3, 'Hélico');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (9, 10, 3, 'Fusée');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (11, 12, 3, 'ULM');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (13, 20, 3, 'Avion');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (14, 15, 4, 'Militaire');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (16, 17, 4, 'Tourisme');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (18, 19, 4, 'Civil');

    Un tri classique :
    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
    SELECT *
    FROM NEW_FAMILLE 
    ORDER BY NFM_BG
     
    -- Renvoie :
    NFM_BG 	NFM_BD 	NFM_NIV 	NFM_LIB
    1 	22 	1 	Transport
    2 	21 	2 	Aérien
    3 	4 	3 	Planeur
    5 	6 	3 	Parachute
    7 	8 	3 	Hélico
    9 	10 	3 	Fusée
    11 	12 	3 	ULM
    13 	20 	3 	Avion
    14 	15 	4 	Militaire
    16 	17 	4 	Tourisme
    18 	19 	4 	Civil
    Et je cherche à obtenir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    NFM_BG 	NFM_BD 	NFM_NIV 	NFM_LIB
    1 	22 	1 	Transport
    2 	21 	2 	Aérien
    13 	20 	3 	Avion
    18 	19 	4 	Civil
    14 	15 	4 	Militaire
    16 	17 	4 	Tourisme
    9 	10 	3 	Fusée
    7 	8 	3 	Hélico
    5 	6 	3 	Parachute
    3 	4 	3 	Planeur
    11 	12 	3 	ULM
    Quelqu'un a une idée ?

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 924
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 924
    Points : 51 726
    Points
    51 726
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM   NEW_FAMILLE
    ORDER  BY NFM_BD - NFM_BG + NFM_NIV DESC,  NFM_LIB
    Tout est possible en SQL !

    A +

  3. #3
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    Bonjour,

    En effet, avec le jeu de test donné cela fonctionne.

    Par contre, si on prend un cas dans lequel 2 éléments de même niveau ont un nombre d'enfant différent, cela ne fonctionne plus :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (1, 28, 1, 'Transport');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (2, 27, 2, 'Aérien');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (3, 4, 3, 'Planeur');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (5, 6, 3, 'Parachute');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (7, 8, 3, 'Hélico');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (9, 10, 3, 'Fusée');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (11, 12, 3, 'ULM');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (13, 20, 3, 'Avion');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (14, 15, 4, 'Militaire');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (16, 17, 4, 'Tourisme');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (18, 19, 4, 'Civil');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (21, 26, 3, 'Animal');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (22, 23, 4, 'Oiseau');
    INSERT INTO NEW_FAMILLE (NFM_BG, NFM_BD, NFM_NIV, NFM_LIB)       VALUES (24, 25, 4, 'Insecte');

    Résultat obtenu :
    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
    NFM_BG 	NFM_BD 	NFM_NIV 	NFM_LIB
    1 	28 	1 	Transport
    2 	27 	2 	Aérien
    13 	20 	3 	Avion
    21 	26 	3 	Animal  << Groupes Avion et Animal mélangés
    18 	19 	4 	Civil
    24 	25 	4 	Insecte
    14 	15 	4 	Militaire
    22 	23 	4 	Oiseau
    16 	17 	4 	Tourisme
    9 	10 	3 	Fusée
    7 	8 	3 	Hélico
    5 	6 	3 	Parachute
    3 	4 	3 	Planeur
    11 	12 	3 	ULM

    Résultat attendu :
    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
    NFM_BG 	NFM_BD 	NFM_NIV 	NFM_LIB
    1 	22 	1 	Transport
    2 	21 	2 	Aérien
    21 	26 	3 	Animal
    24 	25 	4 	Insecte
    22 	23 	4 	Oiseau
    13 	20 	3 	Avion
    18 	19 	4 	Civil
    14 	15 	4 	Militaire
    16 	17 	4 	Tourisme
    9 	10 	3 	Fusée
    7 	8 	3 	Hélico
    5 	6 	3 	Parachute
    3 	4 	3 	Planeur
    11 	12 	3 	ULM

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    445
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 445
    Points : 622
    Points
    622
    Par défaut
    J'ai essayé de la faire en MySQL. Je suis arrivé à ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT N1.NFM_BG,N1.NFM_BD,N1.NFM_NIV,N1.NFM_LIB,GROUP_CONCAT(N2.NFM_LIB ORDER BY N2.NFM_NIV,N2.NFM_LIB) AS ascendance
    FROM NEW_FAMILLE N1
    INNER JOIN NEW_FAMILLE N2
    ON  N2.NFM_BG <= N1.NFM_BG
    AND N2.NFM_BD >= N1.NFM_BD
    GROUP BY N1.NFM_BG,N1.NFM_BD,N1.NFM_NIV,N1.NFM_LIB
    ORDER BY ascendance
    '1', '28', '1', 'Transport', 'Transport'
    '2', '27', '2', 'Aérien', 'Transport,Aérien'
    '21', '26', '3', 'Animal', 'Transport,Aérien,Animal'
    '24', '25', '4', 'Insecte', 'Transport,Aérien,Animal,Insecte'
    '22', '23', '4', 'Oiseau', 'Transport,Aérien,Animal,Oiseau'
    '13', '20', '3', 'Avion', 'Transport,Aérien,Avion'
    '18', '19', '4', 'Civil', 'Transport,Aérien,Avion,Civil'
    '14', '15', '4', 'Militaire', 'Transport,Aérien,Avion,Militaire'
    '16', '17', '4', 'Tourisme', 'Transport,Aérien,Avion,Tourisme'
    '9', '10', '3', 'Fusée', 'Transport,Aérien,Fusée'
    '7', '8', '3', 'Hélico', 'Transport,Aérien,Hélico'
    '5', '6', '3', 'Parachute', 'Transport,Aérien,Parachute'
    '3', '4', '3', 'Planeur', 'Transport,Aérien,Planeur'
    '11', '12', '3', 'ULM', 'Transport,Aérien,ULM'

  5. #5
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    En effet, je ne connaissais pas la fonction GROUP_CONCAT mais elle aide pas mal sur ce coup la.

    Connaissant l’intérêt que porte SQLpro à l'égard de MySQL, va t il réussir à trouver une alternative plus simple ?
    Ou se résigner à l'idée que MySQL a été plus fort sur ce coup ?

  6. #6
    Membre expérimenté
    Avatar de islamov2000
    Homme Profil pro
    Ingénieur d'études & developpement en informatique
    Inscrit en
    Septembre 2007
    Messages
    814
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Ingénieur d'études & developpement en informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2007
    Messages : 814
    Points : 1 717
    Points
    1 717
    Billets dans le blog
    6
    Par défaut
    essaie ça et bon courage

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select t.nfm_bg,t.nfm_bd from NEW_FAMILLE t
    order by t.nfm_bd-t.nfm_bg desc,t.nfm_bg desc
    resultat:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       	NFM_BG	NFM_BD
    1	1	22
    2	2	21
    3	13	20
    4	18	19
    5	16	17
    6	14	15
    7	11	12
    8	9	10
    9	7	8
    10	5	6
    11	3	4

  7. #7
    Membre émérite
    Avatar de Seb33300
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2007
    Messages
    1 564
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Thaïlande

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 564
    Points : 2 399
    Points
    2 399
    Par défaut
    C'est le même résultat que la requête donnée par SQLpro qui ne satisfait pas le 2 ème exemple donné.

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

Discussions similaires

  1. Gestion d'arbres par représentation intervallaire - Déplacements et tris
    Par samche dans le forum Algorithmes et structures de données
    Réponses: 11
    Dernier message: 18/06/2013, 16h58
  2. Réponses: 0
    Dernier message: 24/08/2007, 11h19
  3. Gestion d'arbres par représentation intervallaire
    Par Djebel dans le forum Langage SQL
    Réponses: 4
    Dernier message: 15/10/2006, 18h28
  4. arbre par représentation intervallaire
    Par peuf23 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/10/2006, 00h16
  5. Gestion d'arbres par représentation intervallaire
    Par brice01 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 23/01/2006, 22h20

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