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 22/02/2011, 11h59   #1
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Par défaut Aide sur une requête

Bonjour,
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
SELECT m.noms AS noms, s.genre AS sexe, 
CONCAT(COUNT(dl.id_legis), ' - ', GROUP_CONCAT(CAST(dl.id_legis AS CHAR) ORDER BY dl.id_legis SEPARATOR ', ' )) AS liste_legis, 
COUNT(DISTINCT pp.id_parti) AS total_parti, GROUP_CONCAT(DISTINCT pp.sigle ORDER BY pp.id_parti SEPARATOR ", " ) AS liste_parti,
COUNT(DISTINCT dl.id_dpt) AS total_dpt, GROUP_CONCAT(DISTINCT d2.libelledpt ORDER BY d2.libelledpt SEPARATOR ", " ) AS liste_dpt,
r.libelleregion AS region
FROM membres AS m
LEFT JOIN sexe AS s ON m.sexe = s.id_sexe
LEFT JOIN depute_legislatures AS dl ON dl.id_depute = m.id_membre
LEFT JOIN partis_politiques AS pp ON dl.id_parti = pp.id_parti
LEFT JOIN departements AS d2 ON d2.iddpt = dl.id_dpt
LEFT JOIN regions AS r ON r.idregion = d2.idregion
WHERE dl.id_legis NOT IN (1,2,3,4,5,6,8)
GROUP BY dl.id_depute 
ORDER BY m.noms
Le problème est à ce niveau :
Code :
1
2
 
WHERE dl.id_legis NOT IN (1,2,3,4,5,6,8)
Sachant qu'un député peut faire plusieurs législatures, moi je souhaite par cette requte les députés ayant fait uniquement la 7e

Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 12h01   #2
ced
Rédacteur/Modérateur

 
Avatar de ced
 
Homme Cédric Duprez
Inscription : avril 2002
Messages : 3 823
Détails du profil
Informations personnelles :
Nom : Homme Cédric Duprez
Âge : 36
Localisation : France, Loiret (Centre)

Informations professionnelles :
Secteur : Agroalimentaire - Agriculture

Informations forums :
Inscription : avril 2002
Messages : 3 823
Points : 6 441
Points : 6 441
Et pourquoi pas :
Sinon, il nous faudrait un peu plus d'info sur ton modèle de données.

ced
__________________
Rédacteur / Modérateur SGBD
Mes tutoriels et la FAQ MySQL

----------------------------------------------------
Pensez aux balises code et au tag
Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça
ced est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 12h37   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Si tu veux les députés qui ont fait uniquement la 7, il faut faire ainsi pour ton filtre :
Code sql :
1
2
3
4
5
6
7
 
WHERE NOT EXISTS(
    SELECT *
    FROM depute_legislatures AS dl2
    WHERE dl2.id_depute = m.id_membre
    AND dl2.id_legis <> 7
)

et remplacer ta jointure externe par une jointure interne sur la table depute_legislatures :

Code sql :
1
2
 
INNER JOIN depute_legislatures AS dl ON dl.id_depute = m.id_membre AND dl.id_legis = 7

Soit : "ceux qui ont fait la 7 et qui n'en n'ont pas fait d'autre"
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 13h59   #4
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Citation:
Envoyé par aieeeuuuuu Voir le message
Code sql :
1
2
3
4
5
6
7
 
WHERE NOT EXISTS(
    SELECT *
    FROM depute_legislatures AS dl2
    WHERE dl2.id_depute = m.id_membre
    AND dl2.id_legis <> 7
)
En ajoutant cette clause j'ai 82 résultats.

mais si je modifie la jointure
Code sql :
1
2
 
LEFT JOIN depute_legislatures AS dl ON dl.id_depute = m.id_membre
ainsi :
Citation:
Envoyé par aieeeuuuuu Voir le message
Code sql :
1
2
 
INNER JOIN depute_legislatures AS dl ON dl.id_depute = m.id_membre AND dl.id_legis = 7
J'ai 81 résultats, une différence d'un résultat. Pourquoi une jointure interne? En plus merci je ne savais pas que dans le ON d'une jointure on peut ajouter un AND
Merci d'avance pour les explications...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2011, 14h14   #5
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Votre jointure externe fait ressortir tous les députés, même ceux qui ne sont pas referencés dans la table depute_legislatures. (avec les colonnes de depute_legislatures à NULL).

Vous n'avez pas besoin de ces députés dans votre résultat, puisque vous cherchez précisément ceux qui ont fait la 7eme législature. Donc une jointure externe est inutile.

En ajoutant la condition id_legis=7 dans la condition de jointure, pour une jointure interne, cela éliminera aussi les députés qui n'ont pas fait la 7éme...

Il ne reste plus qu'a vérifier que les députés résultant de cette jointure interne n'ont effectué aucune autre législature (objet du WHERE NOT EXISTS...)

donc si vous avez une ligne de moins avec la jointure interne, c'est que vous devez avoir un député qui remplie la condition de filtre (n'a fait aucune legislature autre que la 7), mais ne rempli pas la condition de jointure (n'a pas fait la legislature 7), ce qui au final revient à dire que vous devez avoir un député qui n'a fait aucune législature...

Vous devriez le retrouver avec ceci :
Code sql :
1
2
3
4
 
SELECT *
FROM membre
WHERE id_membre NOT IN (SELECT id_depute FROM depute_legislatures )

Si je ne me trompe pas, cela doit vous renvoyer une seule ligne ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2011, 11h22   #6
Membre éclairé
 
Homme Gérard Okono
Développeur Web
Inscription : juillet 2006
Messages : 707
Détails du profil
Informations personnelles :
Nom : Homme Gérard Okono
Localisation : Cameroun

Informations professionnelles :
Activité : Développeur Web
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : juillet 2006
Messages : 707
Points : 328
Points : 328
Merci ca marche super bien.
Maintenant à base de cette requête, je souhaite vérifier si un député avec son noms a effectué la 7ième législature. Si oui dans une colonne de résultat on met 7 - (la liste des autres législatures auxquelles ce député a effectuées).
par exemple 7 - (1,5) si ce député a aussi fait la 1 et 5e législatures.

Merci d'avance...
okoweb est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/02/2011, 13h50   #7
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 990
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 990
Points : 18 240
Points : 18 240
Envoyer un message via MSN à CinePhil
Ta dernière demande relève de la présentation des données et n'est pas le boulot du SGBD mais celui du logiciel qui interroge la BDD.

Mais pour arriver au résultat, il te faut une requête qui affiche toutes les législatures des députés de la 7ème législature.

Avec ce que tu as déjà comme requête, tu devrais y arriver.
__________________
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 00
Vieux 24/02/2011, 14h16   #8
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Citation:
Envoyé par okoweb Voir le message
Maintenant à base de cette requête, je souhaite vérifier si ...

justement non ! pas à partir de cette requête, puisqu'elle exclut les députés qui ont participé a une autre législature que la 7 !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h16.


 
 
 
 
Partenaires

Hébergement Web