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 par SQL?


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 11
    Points
    11
    Par défaut Tri par SQL?
    Bonjour,

    Voici mon problème:

    Dans une base de données, je dispose de composés chimiques avec leur formule.
    Il se trouve que lors de l'affichage de mes composés, il est très efficace de les classer par nombre d'atomes, c'est ainsi que les chimistes les retrouvent le plus rapidement.
    Ainsi, je souhaite trier mes molécules:
    -d'abord selon le nombre de carbones
    -ensuite par nombre de Cl
    -puis par nombre de N
    etc...
    sachant que le tri selon les Cl s'effectuera après le tri par carbone et ainsi de suite.
    On aura ainsi par exemple en ordre:
    C
    CClN4
    CCl2
    C2Cl3N2
    C2Cl3N4
    C2Cl5N5
    C3ClN2
    C3Cl2N
    C4ClN8
    C4Cl2
    De plus, ce tri est destiné à être effectué sur une liste de 400 composés chimiques qui ne cessera de s'agrandir. Par ailleurs, les molécules ne sont absolument pas triées dans la base de données mais rentrées complètement aléatoirement selon les besoins.

    Ainsi, je me demandais si je pouvais me servir directement de MYSQL pour trier mes données.
    Puis je par exemple effectuer un "SELECT molecule ORDER BY C, Cl, N" ou utiliser des Group by avec plusieurs critères de tri (hiérarchisés) ou éventuellement utiliser des requêtes imbriquées?

    Sinon, peut être dois je implanter un algorithme de tri en php a posteriori?

    Qu'en pensez vous? N'hésitez pas à me demander des précisions.

    Merci d'avance pour l'aide que vous pourrez m'apporter.

  2. #2
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si la formule est enregistrée d'un seul bloc dans une colonne, il sera difficile de faire un tri sur un morceau de cette chaîne de caractères.

    Il nous faudrait un peu plus de précision sur votre modèle de données (la structure de vos tables), comme le demandent les les règles applicables sur ce forum.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    En fait, je pense avoir une table de ce type:
    idCompose, nomCompose, formule, C, Cl, N, etc...
    Je viens d'essayer et il semble donc que je puisse faire une requete de type "ORDER BY C, Cl, N" et celle ci me triera correctement mes composés chimiques.

    Il ne me reste plus qu'à faire le trigger qui à l'ajout ou à la modification d'un composé chimique déterminera pour chaque composé chimique le nombre d'atomes correspondant à partir de la formule.

    Résolu

  4. #4
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Si vous n'avez que peu d'éléments chimiques différents qui peuvent intervenir dans vos formules, ça peut être acceptable. Mais tous les éléments chimiques du tableau périodique des éléments peut être employé, alors vous aurez beaucoup de colonnes vides pour rien.

    La bonne modélisation serait plutôt celle-ci :

    MCD :
    Formule -1,n----Contenir----0,n- Element

    Tables :
    Element(E_Id, E_Symbole, E_Nom, ...)
    Formule(F_Id, F_Formule, F_Nom, ...)
    Contenir(C_IdFormule, C_IdElement, C_NbAtomes, ...)
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Cette modélisation (celle que vous proposez) est à première vue la plus propre et celle que je pensais utiliser au départ.
    Cependant, comment trier efficacement mes données avec celle ci?
    Je ne peux plus utiliser de clause ORDER BY multiple.
    J'avais pensé éventuellement créer une VUE permettant de jouer l'intermédiaire mais tout ceci me parait compliqué.

    Sachant que les composés chimiques de ma BDD ne feront entrer en jeu que des Br, C, Cl, F, H, N, O les 99,9% du temps; j'avais pensé utiliser ce type de modèle :



    Mélangeant les deux afin de garantir un tri rapide et facile selon les principaux atomes et une certaine souplesse quant à la formule chimique de mes composés.

    Qu'en pensez vous?

    Merci
    Images attachées Images attachées  

  6. #6
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Punksociety Voir le message
    Ainsi, je souhaite trier mes molécules:
    -d'abord selon le nombre de carbones
    -ensuite par nombre de Cl
    -puis par nombre de N
    La requête suivante devrait afficher les formules par ordre de symbole d'atome (Al, Ar, B, Be, C, Ch, Cl...) puis par quantité inverse (CO2 avant CO) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT f.F_Formule, f.F_Nom
    FROM Formule f
    INNER JOIN Contenir c ON f.F_Id = c.C_IdFormule
    INNER JOIN Element e ON c.C_IdElement = e.E_Id
    ORDER BY e.E_Symbole, c.C_NbAtomes DESC
    A tester.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Je vais faire un test propre afin de voir si cela marche.

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Cela ne semble pas marcher après plusieurs tests.

    Après réflexion, cela me semble normal.
    Les jointures me donnent une table comme ceci:
    idCompose idAtome nomAtome nombreAtomes formule
    ce qui fait que le tri ne peut être efficace.
    Mysql ne va faire que mettre en ordre les deux colonnes nomAtome et nombreAtomes.

    Pour un tri réussi, il faut que j'obtienne une colonne pour chaque atome avec le nombre d'atomes correspondant comme valeur.

    On en revient donc au modèle certes moins propre (bcp de vide) et redondant mais efficace au niveau du tri.

    Mon raisonnement vous semble-t-il logique?

  9. #9
    Modérateur

    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 799
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 799
    Points : 34 031
    Points
    34 031
    Billets dans le blog
    14
    Par défaut
    On pourrait avoir un petit jeu de données et ce que donne la requête STP ?
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole. Autoentrepreneur.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  10. #10
    Membre expérimenté Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Points : 1 738
    Points
    1 738
    Par défaut
    Cinephil vous a donné un exemple de modele, effectivement la requete ne pourra pas faire le tri que vous avez demandé.

    Vous pouvez (toujours selon le modele de Cinephil) introduire une notion de poids de valeur d'element

    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
     
    create table element (E_id int, E_symbole char(3), E_nom char(30), E_poids int)
    insert into element values (4,'Br','Brome' 	,10000000)
    insert into element values (1,'C','Carbone'	,1000000)
    insert into element values (2,'Cl','Chlore'	,100000)
    insert into element values (5,'F','Fluor'  	,10000)
    insert into element values (6,'H','Hydrogene'  ,1000)
    insert into element values (3,'N','Azote'  	,100)
    insert into element values (7,'O','Oxygene'  	,10)
     
     
    create table formule (F_id int, F_Formule char(30), F_Nom char (200))
    insert into formule values (1,'C','Formule 1')
    insert into formule values (2,'CClN4','Formule 2')
    insert into formule values (3,'C4Cl2','Formule 3')
    insert into formule values (4,'C3ClN2','Formule 4')
    insert into formule values (5,'C2Cl3N2','Formule 5')
    insert into formule values (6,'C2Cl3N4','Formule 6')
     
    create table contenir (C_idFormule int, C_IdElement int, C_NbAtomes int)
    insert into contenir values (1,1,1) 
    insert into contenir values (2,1,1) 
    insert into contenir values (2,2,1)
    insert into contenir values (2,3,4)
    insert into contenir values (3,1,4)
    insert into contenir values (3,2,2)
    insert into contenir values (4,1,3)
    insert into contenir values (4,2,1)
    insert into contenir values (4,2,3)
    insert into contenir values (5,1,2)
    insert into contenir values (5,2,3)
    insert into contenir values (5,3,2)
    insert into contenir values (6,1,2)
    insert into contenir values (6,2,3)
    insert into contenir values (6,3,4)
     
    select a.F_Formule  from formule a inner join contenir b on (a.F_id=b.C_idFormule) 
    inner join element c on (c.E_id = b.C_IdElement)
    Group by a.F_Nom
    order by sum(b.C_NbAtomes*c.E_poids)
    Mais cela reste assez limité (car vous ne pouvez pas avoir plus de 9 éléments identiques dans votre formule ou les resultats seraient biaisés)

    Ceci dit, vous pouvez toujours vous inspiré de cela pour affiner votre méthode

    A tester et donc a adapter...
    Bon courage
    Dans la connaissance du monde, ceux qui ne savent rien en savent toujours autant que ceux qui n'en savent pas plus qu'eux. (Pierre Dac)

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    17
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 17
    Points : 11
    Points
    11
    Par défaut
    Merci pour cette réponse, je vais y réfléchir. Le principe semble plutot intéressant même s'il est en effet limité. Beaucoup des molécules auront un nombre d'hydrogène supérieur à 9 par exemple.

    De plus, si on en vient à ajouter de nouveaux atomes, il faudra peut être modifier les poids des autres atomes existants (si c'est "P", pas de pb, mais si c'est "Ar", on doit tout décaler) ce qui devient compliqué.

    Aucun modèle ne semble être parfaitement adapté à ce problème, je crois que le mieux à faire est de trouver un bon compromis.

Discussions similaires

  1. requete sql données triées par mois
    Par italiano1360 dans le forum Zend_Db
    Réponses: 2
    Dernier message: 24/07/2012, 16h07
  2. [SQL] Tri par dates
    Par Lolie11 dans le forum Débuter
    Réponses: 5
    Dernier message: 23/01/2009, 00h29
  3. [SQL-VBA]tri par date dans access
    Par Mickey_Mouse dans le forum VBA Access
    Réponses: 5
    Dernier message: 06/02/2007, 09h49
  4. Requête SQL de tri par date
    Par Alain15 dans le forum Requêtes
    Réponses: 8
    Dernier message: 03/08/2006, 08h34
  5. Réponses: 1
    Dernier message: 29/03/2006, 11h33

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