Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 25/02/2011, 14h32   #1
Membre régulier
 
Inscription : juin 2008
Messages : 114
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 114
Points : 84
Points : 84
Par défaut Filtrer les résultats d'une requête

J’ai un souci avec la requête que voici :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT rm.ID, wrcr.`Date` AS date_blocage, max(wmvb.`Value`) AS date_fin
FROM Member rm, RuleCalculationReport wrcr, MemberVariable_b wmvb 
WHERE rm.ID = wrcr. MemberID
AND rm.ID = wmvb. MemberID
AND wmvb. VariableID = 44
AND rm.CBlocked = 'YES'
AND rm.CBlockedFor = 'NO'
AND rm.SiteLang = 'fr'
AND wrcr.Answered = 'NO'
AND wrcr.`Date` < ADDDATE(now(), INTERVAL -6 MONTH)
AND rm.`Type` = 'COACHED'
GROUP BY rm.ID
La requête ci-dessus donne un résultat sur lequel je souhaite faire un tri supplémentaire : je veux que la ligne soit présente dans mon résultat uniquement si le date_fin est inférieur à la date du jour (sysdate()).
J’ai essayé de rajouter une clause pour que la requête ne me sélectionne que les lignes qui on le max(wmvb .value) inférieur à la date du jour en ajoutant la clause date_fin < sysdate(), mais ce n’est pas permis par la syntaxe SQL sous MySQL.
A part se servir de cette requête comme une sous requête (ce que je souhaite éviter), je ne vois pas trop quoi faire.
Auriez-vous une autre solution ?

D’avance merci pour votre aide.
bilbot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/02/2011, 07h48   #2
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 992
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 992
Points : 18 249
Points : 18 249
Envoyer un message via MSN à CinePhil
1) Les jointures s'écrivent depuis 1992 avec l'opérateur JOIN.

2) Un autre SGBD qu MySQL aurait refusé votre requête car toutes les colonnes ne faisant pas l'objet d'une fonction de regroupement, doivent figurer dans le GROUP BY ; MySQL est trop permissif. Conséquence, la date qu'affichera la requête est aléatoire !

3) Tu ne devrais pas utiliser de mot réservé du langage SQL pour nommer tes colonnes et tes tables.

4) Je peux comprendre que tu souhaites éviter une sous requête mais je pense que dans ton cas tu ne peux y échapper, même avec ta requête renormalisée, si l'ajout de la date dans le regroupement ne te donne pas le résultat souhaité.

Citation:
je veux que la ligne soit présente dans mon résultat uniquement si le date_fin est inférieur à la date du jour (sysdate()).
Voici ta requête renormalisée avec la réponse au problème et sans sous requête mais avec la date dans le regroupement.
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT rm.ID, 
  wrcr.`Date` AS date_blocage, 
  MAX(wmvb.`Value`) AS date_fin
FROM Member rm
INNER JOIN RuleCalculationReport wrcr ON rm.ID = wrcr. MemberID
INNER JOIN MemberVariable_b wmvb ON rm.ID = wmvb. MemberID
WHERE wmvb. VariableID = 44
  AND rm.CBlocked = 'YES'
  AND rm.CBlockedFor = 'NO'
  AND rm.SiteLang = 'fr'
  AND wrcr.Answered = 'NO'
  AND wrcr.`Date` < ADDDATE(CURRENT_DATE, INTERVAL -6 MONTH)
  AND rm.`Type` = 'COACHED'
GROUP BY rm.ID, wrcr.`Date`
HAVING MAX(wmvb.`Value`) < CURRENT_DATE
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 11h13   #3
Membre régulier
 
Inscription : juin 2008
Messages : 114
Détails du profil
Informations forums :
Inscription : juin 2008
Messages : 114
Points : 84
Points : 84
Merci beaucoup, et ça m'a même permis de corriger une erreur dans ma requête et il me semblait bien que c'était pas bien difficile

Pour le nom des champs des colonnes je suis entièrement d'accord avec mais malheureusement, j'hérite de l'appli et dans toute les table il y a des champs qui ont le nom date et value....

Pour les jointures interne, j'ai pris la mauvais habitude de ne pas utiliser inner join, je sais c'est mal, il faut que je m'astreigne à le faire. Sinon hormis le fait de respecter la norme, le SGBD traite plus vite les requêtes avec un inner join ?
bilbot est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/02/2011, 16h41   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 992
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
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 : 10 992
Points : 18 249
Points : 18 249
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par bilbot Voir le message
Sinon hormis le fait de respecter la norme, le SGBD traite plus vite les requêtes avec un inner join ?
En principe, c'est identique.
Mais en plus de respecter la norme, la syntaxe officielle avec JOIN permet de mieux distinguer ce qui relève de la jointure de ce qui relève de la restriction (WHERE) et permet d'éviter des erreurs grossières quand il y a de multiples jointures, du genre condition de jointure manquante ou instance de table manquante. J'ai déjà rencontré le cas pas mal de fois avec des requêtes postées sur les forums BDD de Developpez.com et simplement corrigées en les réécrivant avec la syntaxe normalisée.
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« 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 Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h00.


 
 
 
 
Partenaires

Hébergement Web