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 :

prioriser les résultats dans une requête en fonction d'une règle de gestion


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut prioriser les résultats dans une requête en fonction d'une règle de gestion
    Bonjour,

    Je me casse les dents pour faire fonctionner une requête qui récupère des articles en fonction de la date du jour et des opérations commerciales qui lui sont appliquées OU non.

    Je ne poste pas ma requête pour le moment.

    Je vous explique très concrètement ma requête et vous allez me dire si vous voyez d'entrée de jeu une commande SQL qui s'y porterait bien.

    Un article peut avoir N opérations commerciales qui lui sont appliquées sur une même période et en base de données. Sur le site je dois appliquer/afficher une seule opération commerciale et pour cela j'ai une règle de gestion simple visant à "prioriser" les opé, elle est la suivante : ope1>ope2>ope3.

    Sommairement :
    Ope 1 est prioritaire sur toutes les opé....
    Ope 2 est prioritaire sur l'ope 3...

    Déjà voyez-vous une syntaxe sql intéressante pour ce faire (genre avec des IF dans un WHERE par exemple...je n'ai rien trouvé là dessus) ?

    Sachant que je récupère les opé/articles par un LEFT JOIN car un produit n'est pas forcément en ope, comment et surtout Où puis-je affecter une telle règle de gestion afin de ne récupérer qu'un seul état produit en fonction de l'opé ?

    Je me vois mal faire des IN et NOT IN consécutifs avec des sous-requêtes (pfiou y'a peut-être plus performant). Et ça m'embête de récupérer tous les résultats possibles dans un tableau PHP pour ensuite les trier en conséquence de la règle de gestion.

    Quelque chose me dit qu'une commande SQL (magique!) pourrait solutionner mon problème de "priorisation".

    Merci

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    J'avais déjà fait un truc comme ça. En gros, ça marche comme une requête de type "le plus récent parmi", sauf qu'en l'occurence c'est "le plus prioritaire parmi".

  3. #3
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    Oui c'est le concept effectivement "le plus prioritaire parmi", et il s'agirait donc quelque part de traiter une liste de choix.
    Si tu retrouves ton cas déjà traité ça m'intéresse beaucoup !

  4. #4
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Citation Envoyé par speedev Voir le message
    Oui c'est le concept effectivement "le plus prioritaire parmi", et il s'agirait donc quelque part de traiter une liste de choix.
    Si tu retrouves ton cas déjà traité ça m'intéresse beaucoup !
    Je pourrais le retrouver, mais le fonctionnel était monstrueusement compliqué... tu n'y comprendrais rien et vraisemblablement moi non plus , donc ça ne ferait pas trop avancer le schmilblick. Peux-tu me donner une maquette (éventuellement simplifiée) de ton cas ?

  5. #5
    Membre éprouvé Avatar de speedev
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 051
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 051
    Par défaut
    J'ai allégé la requête car il y a beaucoup de clauses inutiles pour l'exemple, je pense que tu devrais piger ce que je souhaite avec cette maquette :

    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
    SELECT art_id, L.lao_prx_old , L.lao_prx_new
    FROM version 
    INNER JOIN article AS M ON ([jointures_tables_précédentes])
    LEFT JOIN lnk_art_ope AS L ON (
    	L.lao_art=A.art_id AND (
    		L.lao_ope IN (
    			SELECT ope_id 
    			FROM operation AS P 
    			WHERE 
    			(? BETWEEN P.ope_dad AND P.ope_daf) AND 
                            ope_typ EST_PRIORITAIRE_PARMI (ope1,ope2,ope3)
    
    		)
    	)
    ) 
    WHERE [conditions diverses et variées]
    GROUP BY art_id
    Je récupère tous les articles (par un GROUP BY) mais je souhaite uniquement obtenir leurs caractéristiques (leurs prix en l'occurrence) vis-à-vis de l'opération commerciale la plus prioritaire pour chacun d'eux. La priorité entre chaque OC est la même pour tous les articles.

  6. #6
    Membre Expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 73
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Par défaut
    Saluton,
    Je pense à un LEFT JOIN sur une sous-requête sur la table `lnk_art_ope`, sous-requête corrélée par l'id de l'article, classée par ORDER BY ope DESC et LIMIT 1.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  7. #7
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 292
    Par défaut
    Je réfléchis au fur et à mesure... déjà, je réécrirais ta requête en éliminant la sous-requête inutile :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT art_id, L.lao_prx_old , L.lao_prx_new
    FROM version 
      INNER JOIN article AS M ON ([jointures_tables_précédentes])
      LEFT JOIN lnk_art_ope AS L ON L.lao_art=A.art_id 
      LEFT JOIN operation AP ON L.lao_ope = P.ope_id 
        AND ? BETWEEN P.ope_dad AND P.ope_daf
        AND P.ope_typ EST_PRIORITAIRE_PARMI (ope1,ope2,ope3)
    WHERE [conditions diverses et variées]
    GROUP BY art_id
    Ensuite, il faut traduire ta priorité par un indicateur numérique. L'idéal serait d'avoir une colonne Priorite sur la table operation ou sur la table types_operation que tu as peut-être...

    A défaut, on peut calculer cette prio avec un CASE WHEN ou, plus joli, avec un FIND_IN_SET. Si je retiens cette dernière hypothèse, la requête deviendrait qqch comme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    SELECT art_id, L.lao_prx_old , L.lao_prx_new
    FROM version 
      INNER JOIN article AS M ON ([jointures_tables_précédentes])
      LEFT JOIN lnk_art_ope AS L ON L.lao_art=A.art_id 
      LEFT JOIN operation AP ON L.lao_ope = P.ope_id 
        AND ? BETWEEN P.ope_dad AND P.ope_daf
        AND FIND_IN_SET(P.ope_typ, 'ope1', 'ope2', 'ope3') <= ALL (SELECT FIND_IN_SET(P2.ope_typ, 'ope1', 'ope2', 'ope3') 
      FROM lnk_art_ope AS L2 INNER JOIN operation P2 on L2.lao_ope = P2.ope_id
      WHERE L2.lao_art = A.art_id AND ? BETWEEN P2.ope_dad AND P2.ope_daf)
    WHERE [conditions diverses et variées]
    GROUP BY art_id

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

Discussions similaires

  1. [AC-97] Calculs dans une requête en fonction d'une variable d'un formulaire
    Par Cire37 dans le forum VBA Access
    Réponses: 3
    Dernier message: 11/06/2010, 09h39
  2. [Oracle 10G] Filtrer une requête en fonction d'une autre table
    Par shaun_the_sheep dans le forum Oracle
    Réponses: 4
    Dernier message: 27/04/2008, 04h49
  3. Réponses: 0
    Dernier message: 18/02/2008, 22h05
  4. Réponses: 2
    Dernier message: 26/07/2007, 14h27
  5. Réponses: 8
    Dernier message: 08/06/2007, 10h42

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