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 21/12/2010, 11h30   #1
Membre confirmé
 
Avatar de baggie
 
Inscription : octobre 2007
Messages : 676
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2007
Messages : 676
Points : 225
Points : 225
Par défaut Récupération des valeurs sauf celles commençant par >>

Bonjour,

j'ai une table contenant des libellés.
Chaque libellé correspond à un local (un n°) et à un id (un autre n°).
Chaque libellé a également une date et un champ de type booléen.
Un local peut avoir plusieurs libellés, de même qu'un id.

Je souhaite récupérer le nombre de libellés ayant '0' en champ booléen pour chaque local, pour un id donné.

Ce qui me donne pour le moment, cette requête :
Code :
1
2
3
4
5
 
SELECT DISTINCT numerolocal, COUNT(id) AS nb
FROM matable
WHERE id = '.$id.' AND champ_booleen = 0
GROUP BY numerolocal
$id étant l'id que je récupère en php.

J'obtiens :
Citation:
N°local -> nb d'id
1 -> 3
4 -> 3
6 -> 2
Jusque là, pas de problème.

Maintenant, je souhaite toujours faire la même requête mais en comptant uniquement les id où le libellé ne commence pas par ">>".

J'ai donc fait ceci :
Code :
1
2
3
4
5
6
 
SELECT DISTINCT numerolocal, libelle, COUNT(id) AS nb
FROM matable
WHERE id = 21341 AND champ_booleen = 0
GROUP BY numerolocal
HAVING libelle NOT LIKE ">>%"
Et cette requête m'enlève totalement un local si au moins un libellé commence par ">>".

J'obtiens :
Citation:
N°local -> nb d'id
1 -> 3
4 -> 3
Le local 6 a été sorti parce qu'un des deux libellés commençait par ">>".

Comment puis-je faire ?
Merci
baggie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 12h02   #2
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
Tu ne dois pas mettre ta condition dans le having, mais dans le where. Je pense, je te laisse tester pour confirmer.
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 12h06   #3
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
a priori non. Le WHERE jouera sur l'ensemble retourné par le GROUP BY. Il faut remplacer le FROM maTable par FROM(SELECT...WHERE) AS sousTable dans lequel tu supprimes les lignes indésirables par le WHERE. Le GROUP BY jouera ensuite sur cet ensemble retourné

Reste plus ensuite qu'à trouver une autre combine pour avoir le nombre correct dans le COUNT(id). ici, il représentera le nombre d'id dont le libellé ne contiendra pas de ">>". Si tu veux le nombre d'id contenant également ">>" (tous donc) => faudra réfléchir à nouveau
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 13h51   #4
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 977
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 977
Points : 18 221
Points : 18 221
Envoyer un message via MSN à CinePhil
Citation:
Envoyé par Madfrix Voir le message
a priori non. Le WHERE jouera sur l'ensemble retourné par le GROUP BY.
Non !
WHERE agit sur chaque ligne.
HAVING agit sur le résultat d'un regroupement GROUP BY.

gwinyam a raison, il faut mettre cette condition dans le WHERE.

Plusieurs autres choses à dire sur la requête.
1) Distinct est inutile puisqu'il y a déjà un GROUP BY

2) Inutile de compter les id quand il suffit de compter les lignes donc COUNT(*) est suffisant et plus performant.

3) Les valeurs textuelles s'écrivent entre apostrophes, pas entre guillemets.

4) Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de regroupement doivent figurer dans le GROUP BY.
Un autre SGBD que MySQL, qui est trop permissif avec la norme SQL, refuserait la requête.

Voici la requête qui devrait convenir :
Code :
1
2
3
4
5
6
SELECT numerolocal, libelle, COUNT(*) AS nb
FROM matable
WHERE id = 21341 
    AND champ_booleen = 0
    AND libelle NOT LIKE '>>%'
GROUP BY numerolocal, libelle
Si vous ne souhaitez regrouper que par numerolocal et pas par libelle, supprimez libelle du SELECT et du GROUP BY.
__________________
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 déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 21/12/2010, 14h03   #5
Membre confirmé
 
Avatar de baggie
 
Inscription : octobre 2007
Messages : 676
Détails du profil
Informations personnelles :
Âge : 23
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : octobre 2007
Messages : 676
Points : 225
Points : 225
Merci bien, tout fonctionne correctement
baggie est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 14h07   #6
Membre Expert
 
Avatar de Madfrix
 
Inscription : juin 2007
Messages : 2 278
Détails du profil
Informations personnelles :
Localisation : France, Gironde (Aquitaine)

Informations forums :
Inscription : juin 2007
Messages : 2 278
Points : 2 324
Points : 2 324
Citation:
Envoyé par CinePhil Voir le message
Non !
Exact ! J'ai dis n'importe quoi

je me suis embrouillé en pensant à un autre exemple perso ou je devais faire un regroupement sur un champ en retournant le max d'un autre champ et où j'avais pas trouvé mieux à faire que de faire une sous requête filtrante avant le GROUP BY...


Mea culpa
Madfrix est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/12/2010, 16h38   #7
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
Citation:
Envoyé par CinePhil Voir le message
4) Toutes les colonnes du SELECT ne faisant pas l'objet d'une fonction de regroupement doivent figurer dans le GROUP BY.
Un autre SGBD que MySQL, qui est trop permissif avec la norme SQL, refuserait la requête.
J'avais oublié ce point. Un petit rappel des bases de temps en temps, ça fait pas de mal mine de rien. Merci d'être intervenu de façon aussi complète et instructive.
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est dé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 06h35.


 
 
 
 
Partenaires

Hébergement Web