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 :

Un tri en fonction de la pertinence


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Par défaut Un tri en fonction de la pertinence
    Bonjour,

    Peut-on trier des enregistrements mysql en fonction du nombre de condition que ledit enregistrement affirme?

    Par exemple la requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom
    FROM personne
    WHERE taille BETWEEN 150 AND 160 OR poids BETWEEN 50 AND 60
    Je souhaiterais faire afficher d'abord les "noms" des "personnes" affirmant les deux conditions (cad ayant une "taille" entre 150 et 160 centimètre et un "poids" entre 50 et 60 kgs). Puis ceux n'affirmant que la première condition, et enfin ceux n'affirmant que la dernière condition.

    Le but étant de faire cela directement en MySQL. Il est possible de le faire en retraitant les données via PHP mais ce n'est ici pas le but de la demande.

    Merci d'avance pour votre aide!

  2. #2
    Membre chevronné Avatar de papyphp
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    438
    Détails du profil
    Informations personnelles :
    Âge : 75
    Localisation : Belgique

    Informations professionnelles :
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 438
    Par défaut
    Bonjour,

    amha il faut trois requêtes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom
    FROM personne
    WHERE taille BETWEEN 150 AND 160 AND poids BETWEEN 50 AND 60
    deuxième groupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom
    FROM personne
    WHERE taille BETWEEN 150 AND 160 AND ( poids < 50 OR poids > 60)
    Troisième groupe

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT nom
    FROM personne
    WHERE ( taille < 150 OR taille > 160) AND poids BETWEEN 50 AND 60

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Salut,

    Une autre solution est de créer une colonne <ordre> dynamique qui va justement te permettre de faire l'ordre que tu souhaites.

    Je m'expliques.
    Il est posssible en SQL de faire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *, 
    CASE
       WHEN col1 = A THEN 0
       WHEN col1 = N THEN 1
       ELSE 3
    END as ordre
    FROM toto
    WHERE y OR z
    ORDRE BY ordre
    L'idée c'est de mettre les différentes conditions dans un when du select, et d'y attribuer une importance, enfin on ordonne le tout par importance attribuée.
    Pour la doc cf: http://dev.mysql.com/doc/refman/5.0/...functions.html

    Cependant, il y à deux choses à signifier. Les conditions sont en durs dans la requete (même si tu as un peu de controle dessus, c'est assez peu flexible), deuxiemement, c'est beaucoup de calcul, et donc une requete qui peut être lourde et prendre un certain temps à s'executer.

    L'autre solution c'est encore de créer une table de correspondance conditions=>personne pour savoir qui valide quelles conditions, et ensuite attribuées des ordres d'importances pour chaque conditions.
    Il n'y à plus alors qu'à faire un select sur les tables personnes, conditions, personnes=>conditions pour récupérer les personnes qui correspondent à tels ou tels critères dans l'ordre d'importance souhaités.
    C'est un modèle bien plus flexible à programmer, mais un peu plus compliqué à mettre en place.

    bye

  4. #4
    Membre confirmé
    Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Février 2006
    Messages : 70
    Par défaut
    Merci pour vos réponses.

    Je trouve les solutions de "kaymak" intéressantes.
    Par contre je ne suis pas sûr d'avoir bien saisie la seconde.

    Si tu as le temps, pourrais-tu la développer un peu s'il te plait?

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 448
    Par défaut
    Hm. Je vais tenter d'éclairer ta lanterne...
    Mais ce n'est pas forcément simple pour moi aussi, et puis j'avou avoir proposé l'idée on the scratch. Elle mérite donc un peu de réflexion et de validation....

    Pour la seconde solution, l'idée c'est de modéliser tes conditions et leurs résultats.
    Ceci afin de ne plus calculer les résultats des conditions, et donc de simplement les lire.
    Ce qui est terriblement efficace pour un sgbd lorsque l'on à un souci de perf.

    Dans ta requete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT nom
    FROM personne
    WHERE 
    taille BETWEEN 150 AND 160 
    OR 
    poids BETWEEN 50 AND 60
    On pourrait extraire et modéliser les deux conditions, puis y attribuer à chacune une importance (pour +tard ordonner).

    Pour cela il nous faudrait, notre table
    <personne>
    - id
    - nom
    Une table de condition
    <condition>
    - id
    - type (taille, poids, ect)
    - min_val
    - max_val
    - importance
    Une table d'association m,n
    <personne_condition>
    - id_personne
    - id_condition

    La table <personne> tu la connais bien.
    La table <condition> modèlise les conditions que l'on essaie de ne pas calculer.
    La table <personne_condition> modélise les résultats, à savoir qui remplit telle ou telle condition.


    Avec un ce schéma tu requetes ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM personne p
    INNER JOIN personne_condition pc ON (p.id = pc.id_personne)
    INNER JOIN conditions c ON (c.id = pc.id_condition)
    WHERE
    (c.type = 'poids' AND min_val =50 AND max_val=60)
    OR
    (c.type='taille' AND min_val=150 AND max_val=160)
    ORDER BY c.importance
    Si tout fonctionne comme je le pense, et cela est à vérifier.
    Tu réalises ici ce que tu ferais avec un CASE WHEN, en executant une lecture de ta base de données et non plus en effectuant des calculs à la volée.

    Dans cette configuration il reste un élément à réaliser, remplir la table <personne_condition> qui nous permet de savoir quelle personne remplit quelle condition.
    Cela dépend de la nature et du nombre de tes données...
    Soit un calcul lors de l'insertion d'une personne, soit une tache cron journlière.

    Enfin voilà. Comme je te le dis plus haut, c'est on the scratch, mais dans l'idée soit doit fonctionner, faudrait juste le valider.

    bye

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

Discussions similaires

  1. [MySQL] Tri en fonction de la marque
    Par solaris13 dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 23/10/2008, 14h50
  2. [MySQL] classement par tri en fonction d'une variable
    Par qeumarh dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 26/05/2008, 08h12
  3. Réponses: 1
    Dernier message: 28/08/2007, 19h18
  4. [VBA-E] Tri en fonction de lettre
    Par Deejoh dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 06/10/2005, 16h12
  5. [XSLT] Tri en fonction d'un paramètre
    Par virgul dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 21/04/2005, 10h29

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