Jointure SQL

ViPHP
ViPHP | 2144 Messages

26 oct. 2005, 23:43

Je manque de pratique ces derniers temps et Je sèche sur une requêtte sql un peu complexe :D :D :D

J'ai deux tables:

administration_module
id
libelle

administration_droit
idMembre
idModule


Je souhaitera récuperer tous les tuples de la table module avec en regard le nombre de droit présent dans la table droit, pour le module en gros :

module 1 => 0 droits
module 2 => 1 droits
module 3 => 3 droits
etc...

La requêtte suivante :

Code : Tout sélectionner

SELECT m.libelle, m.id, count( d.idMembre ) AS numMembre FROM administration_module m LEFT JOIN administration_droit d ON m.id = d.idModule GROUP BY m.id
Effectue l'opération.
Le problême c'est qu'il ne faut compter que les drois correspondants à un certains membre (donc prendre en compte dans le count que les tuples dont idMembre sont égaux à une certaine valeur.
Si j'ajoute une clause where

Code : Tout sélectionner

SELECT m.libelle, m.id, count( d.idMembre ) AS numMembre FROM administration_module m LEFT JOIN administration_droit d ON m.id = d.idModule where d.idMemnre = 7 GROUP BY m.id
Il ne me renvoit que les modules pour lesquels il y a au moins un droit, je devrais récuperer tous les modules même ceux pour lequel le membres n'a aucun droit

Je sais c'est un peu flou; mais difficile d'être plus clair.
Merci d'avance

ViPHP
fab
ViPHP | 2657 Messages

27 oct. 2005, 01:02

where d.idMemnre = 7
il manque pas un b ? :p
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Mammouth du PHP | 19672 Messages

27 oct. 2005, 09:20

Je sais c'est un peu flou; mais difficile d'être plus clair.
Merci d'avance
Si, peut-être avec un mini jeu d'essai, quelques données pour chaque table et un exemple de ce que tu veux obtenir à la sortie :)

Il est possible aussi que tu doives ajouter un des champs dans le GROUP BY : tu as mis le m.id, ajoute le m.libelle ? :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphant du PHP | 219 Messages

27 oct. 2005, 11:19

Salut,

Voici mon idée :
- Ne faut-il pas mettre LEFT OUTER JOIN ?
- Si dans la clause select il n'y a pas de champ de la table module, peut-être est-ce normal, et dans ce cas essaie en ajoutant d.idMembre par exemple

:?:

ViPHP
ViPHP | 2144 Messages

27 oct. 2005, 13:00

Oui, en effet, il manque bien un b, mais ce n'est pas le seul problême(Ce serait trop simple :D :D)

Un petit jeu d'essai :

administration_module
id Libelle
1 photo
2 news
3 admin
4 calendrier

administration_droit
idMembre idModule
1 1
1 1
1 2
2 1
2 2
2 3

Obtenir pour le membre 1

idModule numMembre
1 2
2 1
3 0
4 0

et obtenir pour le membre 2
idModule numMembre
1 1
2 1
3 1
4 0

J'espère que c'est un peu plus clair...

Eléphant du PHP | 219 Messages

27 oct. 2005, 13:35

Salut,

J'avais mal compris :?
Donc si je comprends mieux, il faut faire cela avec une union.
Genre :

Code : Tout sélectionner

SELECT m.libelle, m.id, count( d.idMembre ) AS numMembre FROM administration_module m LEFT JOIN administration_droit d ON m.id = d.idModule where d.idMembre = 7 GROUP BY m.id UNION SELECT libelle, id, '0' AS numMembre FROM administration_module where idModule NOT IN (SELECT Distinct idModule FROM administration_droit where d.idMembre = 7) GROUP BY m.id

ViPHP
ViPHP | 2144 Messages

27 oct. 2005, 19:40

Merci Bcp