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 :

Requête et version MySQL


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Par défaut Requête et version MySQL
    Bonjour,

    j'ai développé une requête fonctionnelle avec MySQL 5.5 mais qui ne marche pas avec MySQL 5.0.

    Etant donné que je n'arrive pas à avoir un message d'erreur parlant, j'aimerai savoir ce qui bloque :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
    COALESCE(a_ouv.NB_ACTION,0) AS NB_ACTION_OUV,
    COALESCE(a.NB_ACTION,0) AS NB_ACTION,
    COALESCE(SUM(CASE WHEN r.statut_risque = 'Ouvert' THEN 1 ELSE 0 END ),0)  AS NB_RISQUE_OUV,
    COALESCE(COUNT(*),0) AS NB_RISQUE,
    COALESCE(SUM(CASE WHEN (GREATEST(COALESCE(r.gravite_planning,0), COALESCE(r.gravite_cout,0), COALESCE(r.gravite_performance,0), COALESCE(r.gravite_accident,0)) * r.probabilite) <= p.acceptabilite THEN 1 ELSE 0 END ),0)  AS NB_ACCEPTABLE
    FROM risque r
    LEFT JOIN (	SELECT COUNT(*) AS NB_ACTION, identifiant_projet AS id_r
    		FROM action GROUP BY identifiant_projet) AS a ON a.id_r=r.identifiant_projet
    LEFT JOIN (	SELECT COUNT(*) AS NB_ACTION, identifiant_projet AS id_r
    		FROM action WHERE statut_action='Ouvert' GROUP BY identifiant_projet) AS a_ouv ON a_ouv.id_r=r.identifiant_projet
    LEFT JOIN projet p ON r.identifiant_projet=p.identifiant_projet
    Merci d'avance..

  2. #2
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    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 818
    Billets dans le blog
    14
    Par défaut
    Au minimum, il manque un GROUP BY puisqu'il y a mélange de calculs et de colonnes dans le SELECT !

    Un autre SGBD que le mauvais MySQL aurait probablement refusé cette requête !

    En plus j'ai de gros doutes sur la pertinence des résultats donnés par la requête !

    D'après ce que j'en comprends, elle est censée donner des éléments sur les risques liés à des projets et les actions qui ont été ouvertes pour limiter les risques.
    Du fait des jointures, il est fort probable que le COALESCE(COUNT(*), 0) AS NB_RISQUE ne donnera pas le nombre de risque mais le nombre d'actions.

    Ne faudrait-il pas grouper à minima par identifiant projet.

    Si vous nous donnez une explication du but de cette requête et la structure des tables impliquées, on pourra vous aider à faire une requête plus juste et peut-être plus simple.
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    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 Expert
    Avatar de ericd69
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2011
    Messages
    1 919
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Avril 2011
    Messages : 1 919
    Billets dans le blog
    1
    Par défaut
    salut,

    un truc: coalesce n'a de sens que si tu risques d'avoir un null qui sort d'une évaluation...

    pour count aucune chance que tu ais un null
    pour le sum ça dépend de ce que te sort le case... or il ne te sort que 0 ou 1...

    piqure de rappel pour cinephil au passage: case n'a d’intérêt que si tu as plus de 2 cas à gérer... sinon on utilise:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    if(condition,si_vrai,si_faux)
    plus compact et surtout optimiser pour ce genre de cas
    tu aurais normalement ce code qui fait donc la même chose:
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT
    a_ouv.NB_ACTION AS NB_ACTION_OUV,
    a.NB_ACTION AS NB_ACTION,
    SUM(if(r.statut_risque = 'Ouvert', 1, 0))  AS NB_RISQUE_OUV,
    COUNT(*) AS NB_RISQUE,
    SUM(if(GREATEST(COALESCE(r.gravite_planning,0), COALESCE(r.gravite_cout,0), COALESCE(r.gravite_performance,0), COALESCE(r.gravite_accident,0)) * r.probabilite) <= p.acceptabilite, 1, 0))  AS NB_ACCEPTABLE
    FROM risque r
    LEFT JOIN (	SELECT COUNT(*) AS NB_ACTION, identifiant_projet AS id_r
    		FROM action GROUP BY identifiant_projet) AS a ON a.id_r=r.identifiant_projet
    LEFT JOIN (	SELECT COUNT(*) AS NB_ACTION, identifiant_projet AS id_r
    		FROM action WHERE statut_action='Ouvert' GROUP BY identifiant_projet) AS a_ouv ON a_ouv.id_r=r.identifiant_projet
    LEFT JOIN projet p ON r.identifiant_projet=p.identifiant_projet

    pour le reste je partage les remarques de cinephil...

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    19
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 19
    Par défaut
    Merci pour ces retours,

    j'ai réorganisé la requête en partant de la table des projets et en mettant les calculs au niveau des jointures. Je pense que MySQL 5.0 va arrêter de crier.

    J'ai quand même été obligé de mettre du COALESCE sur les champs liés aux jointures car il est possible que je me retrouve avec des NULL.

    Pour les curieux (ça reste un peu moche mais je fais avec ) :
    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
     
    SELECT
    	COALESCE(a_ouv.NB_ACTION,0) AS NB_ACTION_OUV,
    	COALESCE(a_all.NB_ACTION,0) AS NB_ACTION,
    	COALESCE(r_ouv.NB_RISQUE_OUV,0)  AS NB_RISQUE_OUV,
    	COALESCE(r_all.NB_RISQUE,0) AS NB_RISQUE,
    	COALESCE(r_acc.NB_ACCEPTABLE,0) AS NB_ACCEPTABLE
    FROM
    	projet p
    	LEFT JOIN (SELECT COUNT(*) AS NB_RISQUE, r.identifiant_projet FROM risque r WHERE 1=1 '.$filtre.' GROUP BY r.identifiant_projet) AS r_all 
    	ON r_all.identifiant_projet=p.identifiant_projet
    	LEFT JOIN (SELECT COUNT(*) AS NB_RISQUE_OUV, r.identifiant_projet FROM risque r WHERE r.statut_risque="Ouvert" '.$filtre.' GROUP BY r.identifiant_projet) AS r_ouv 
    	ON r_ouv.identifiant_projet=p.identifiant_projet
    	LEFT JOIN (SELECT SUM(IF(GREATEST(COALESCE(r.gravite_planning,0), COALESCE(r.gravite_cout,0), COALESCE(r.gravite_performance,0), COALESCE(r.gravite_accident,0)) * r.probabilite <= p.acceptabilite, 1, 0))  AS NB_ACCEPTABLE, r.identifiant_projet FROM risque r JOIN projet p ON r.identifiant_projet=p.identifiant_projet WHERE 1=1 '.$filtre.' GROUP BY r.identifiant_projet) AS r_acc 
    	ON r_acc.identifiant_projet=p.identifiant_projet
    	LEFT JOIN (	SELECT COUNT(*) AS NB_ACTION, a.identifiant_projet FROM action a LEFT JOIN risque r ON r.identifiant_risque = a.identifiant_risque WHERE 1=1 '.$filtre.' GROUP BY a.identifiant_projet) AS a_all 
    	ON a_all.identifiant_projet=p.identifiant_projet
    	LEFT JOIN (	SELECT COUNT(*) AS NB_ACTION, a.identifiant_projet FROM action a LEFT JOIN risque r ON r.identifiant_risque = a.identifiant_risque WHERE a.statut_action="Ouvert" '.$filtre.' GROUP BY a.identifiant_projet) AS a_ouv 
    	ON a_ouv.identifiant_projet=p.identifiant_projet
    WHERE
    	p.identifiant_projet=:identifiant_projet

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

Discussions similaires

  1. Requête hyerarchique avec MySQL
    Par ingamo dans le forum Requêtes
    Réponses: 3
    Dernier message: 09/02/2006, 21h39
  2. [Clause In] et version MySQL
    Par titoux_fr dans le forum Requêtes
    Réponses: 4
    Dernier message: 16/01/2006, 14h44
  3. Requête sur DB mysql
    Par Lord_FEFF dans le forum SQL Procédural
    Réponses: 1
    Dernier message: 09/11/2005, 19h16
  4. [EXISTS] Version MySql ou erreur syntaxe ?
    Par Kimael dans le forum Requêtes
    Réponses: 5
    Dernier message: 01/04/2004, 17h30
  5. Convertir une requête Access en MySQL
    Par iomega dans le forum Langage SQL
    Réponses: 5
    Dernier message: 06/03/2004, 09h47

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