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 :

ORDER BY max d'infos avec plusieurs OR


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 250
    Points : 75
    Points
    75
    Par défaut ORDER BY max d'infos avec plusieurs OR
    Bonjour à tous,

    Je vais tenter d'expliquer ma problématique simplement.

    Je fais une requête avec plusieurs OR me ressortant des infos sur des utilisateurs (caractéristiques propre à chacun des users).
    Le problème est que cette requête se présente comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT * 
    FROM maTable 
    WHERE maTable_info1 = "test" 
      OR maTable_info2 = "test2" 
      OR maTable3 = "test3"
    Les résultats en sortie, tous les utilisateurs ayant au moins un des critères dans l'ordre.

    Seulement je souhaiterais ordonner de cette manière : plus l'user à d'infos (ex : un user remplis les deux conditions maTable_info2 = "test2" et maTable3 = "test3"), mieux il est placé dans les résultats.

    Je ne sais pas si je me suis bien exprimé.

    Si vous voyez une solution, merci d'avance

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonsoir,

    Je pense qu'il faut simplement compter le nombre de critères vérifiés et faire le trie dessus.

    Quelque chose comme ceci (syntaxe MySQL):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
      colX,
      colY, 
      IF(maTable_info1 = 'test', 1, 0) +
      IF(maTable_info2 = 'test2', 1, 0) +
      IF(maTable3 = 'test3', 1, 0) AS tri
    FROM maTable 
    WHERE 
      maTable_info1 = 'test' 
      OR maTable_info2 = 'test2' 
      OR maTable3 = 'test3'
    ORDER BY tri DESC

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 250
    Points : 75
    Points
    75
    Par défaut
    Citation Envoyé par Oishiiii Voir le message
    Bonsoir,

    Je pense qu'il faut simplement compter le nombre de critères vérifiés et faire le trie dessus.

    Quelque chose comme ceci (syntaxe MySQL):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT 
      colX,
      colY, 
      IF(maTable_info1 = 'test', 1, 0) +
      IF(maTable_info2 = 'test2', 1, 0) +
      IF(maTable3 = 'test3', 1, 0) AS tri
    FROM maTable 
    WHERE 
      maTable_info1 = 'test' 
      OR maTable_info2 = 'test2' 
      OR maTable3 = 'test3'
    ORDER BY tri DESC

    Merci de ta réponse rapide.

    J'ai un peu de mal à comprendre ton fonctionnement avec les if + if.... Tu pourrais m'expliquer stp ?

    Merci encore.

  4. #4
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 250
    Points : 75
    Points
    75
    Par défaut
    Pour info j'ai réduis la requête, mais ta soluce fonctionnerais sur une dizaine de IF?

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 250
    Points : 75
    Points
    75
    Par défaut
    Parfait, après test ta soluce semble fonctionner ! Merci !

    Maintenant, aurais-je un moyen de récupérer le nombre de réponse par user, par exemple un user répond à 2 critère, un autre à 3 critères, comment récupérer ces infos ?

    Merci d'avance.

  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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    J'ai l'impression qu'il y a un problème de modélisation des données pour que tu sois obligé de sortir une telle requête !

    On peut avoir la structure réelle de la table ?

  7. #7
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 250
    Points : 75
    Points
    75
    Par défaut
    Enfaite c'est une table qui dispose d'une 20aine de champs (pour des caractéristiques physiques sur l'user)

    Notre site propose une recherche poussée en fonction de ces caractéristiques, et il nous faut une réponse dans tous les cas de la recherche :

    - Si tous les éléments recherchés correspondent, on cherche le/les membres
    - Si un ou plusieurs éléments correspondent on sort le ou les membre (en ordonnant par le nombre de critères correspondants maximum)

  8. #8
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Et si plus tard tu ajoutes des critères, tu devras modifier le schéma de ta BDD et tes programmes !

    Si je comprends bien, tu as la règle de gestion suivante :
    "Un user peut avoir plusieurs caractéristiques et une caractéristique peut définir plusieurs user."

    À cette règle de gestion correspond le MCD suivant :
    Caractéristique -0,n----Définir----0,n- User

    Et à ce MCD correspon les tables suivantes :
    Caracteristique (c_id, c_libelle)
    User (u_id, u_nom...)
    User_Caracteristique (uc_id_user, uc_id_caracteristique, uc_valeur)

    À combien, de caractéristiques répondent les users ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT u.u_nom, COUNT(*) AS nb_carac_OK
    FROM User AS u
    INNER JOIN User_Caracteristique AS uc ON uc.uc_id = u.u_id
      INNER JOIN Caracteristique AS c ON c.c_id = uc.uc_id_caracteristique
    WHERE (c.c_libelle = 'sexe' AND uc.uc_valeur = 'F')
      OR (c.c_libelle = 'age' AND CAST(uc.uc_valeur AS INTEGER) = 40)
      OR (c.c_libelle = 'yeux' AND uc.uc_valeur = 'Bleu')
    -- etc
    GROUP BY u.u_nom

  9. #9
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 250
    Points : 75
    Points
    75
    Par défaut
    Effectivement, le mcd à été un peu zappé étant donné le timing très serré!

    Sinon effectivement on a une table qui fais la relation entre les deux :

    details_users et details_infos

    dans details_infos les id de chacun des cas possible pour chacun des champs de details_users...

    Je sais pas si je m'exprime bien.

    Mais ta requête sortirais les résultats dans l'ordre du nombre de correspondances ?

  10. #10
    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 : 61
    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 048
    Points
    34 048
    Billets dans le blog
    14
    Par défaut
    Citation Envoyé par Subshadow Voir le message
    Mais ta requête sortirais les résultats dans l'ordre du nombre de correspondances ?
    Peut-être en ajoutant un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ORDER BY nb_carac_OK DESC

  11. #11
    Membre régulier
    Inscrit en
    Novembre 2007
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 250
    Points : 75
    Points
    75
    Par défaut
    Ha en effet, j'avais pas vu le count, honte à moi ^^

    Merci beaucoup de ton aide

    On peut dire que c'est résolu

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 19/05/2015, 01h38
  2. Valeur MAX avec plusieurs condition
    Par Beaudelicius dans le forum Excel
    Réponses: 2
    Dernier message: 18/10/2013, 18h36
  3. order by avec plusieurs parametres
    Par calou_33 dans le forum SQL
    Réponses: 2
    Dernier message: 01/09/2009, 11h10
  4. ProgressBar avec plusieurs procédures
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 08/09/2002, 18h03
  5. Shortcut avec plusieurs touches
    Par scorpiwolf dans le forum C++Builder
    Réponses: 4
    Dernier message: 06/07/2002, 15h57

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