user et page sont les listings des utilisateurs et des pages
droit est la base correspondant aux associations page user
Je souhaite donc avoir comme requete la selection de toutes les pages dont protect=0 ou lorsqu’il y a correspondance entre les pages et l’uid d’un user précis.
J’arrive a cette requete mais ce n’est pas correcte
SELECT DISTINCT p.nom FROM page AS p
LEFT OUTER JOIN droit AS d ON p.pid=d.pid
WHERE p.protect=0 OR d.uid=
(SELECT u.uid FROM user AS u WHERE u.name=ash
user et page sont les listings des utilisateurs et des pages
droit est la base correspondant aux associations page user
Je souhaite donc avoir comme requete la selection de toutes les pages dont protect=0 ou lorsqu’il y a correspondance entre les pages et l’uid d’un user précis.
J’arrive a cette requete mais ce n’est pas correcte
SELECT DISTINCT p.nom FROM page AS p
LEFT OUTER JOIN droit AS d ON p.pid=d.pid
WHERE p.protect=0 OR d.uid=
(SELECT u.uid FROM user AS u WHERE u.name=ash[/quote]
Effectivement, cette requete n’est pas bonne.
Moi je ferais
SELECT nom FROM page, user, droit WHERE droit.uid = user.uid AND page.pid = droit.pid AND (p.protect = 0 OR u.name = ash);
Un petit soucis cependant si je n’ai rien inséré dans la table droit la requete ne fonctionne plus alors que normalement elle devrait me ressortir toutes les pages dont page_protect=0
Il n’est pas obligatoire qu’une donnée soit inséré dans la table droit il se peut qu’elle soit vide mais dans ce cas la requete ne me renvois rien.
Si tu fais une jointure sur la table droit, il faut qu’il y ait des données dans cette table, car le nombre d’informations correspondra à sa taille, en principe.
Si celle-ci est vide, il faut éviter de faire une jointure dessus (enlever page.pid = droit.pid ) mais ça n’a pas de sens, puisque normalement chaque page doit avoir un droit de lecture.
Ca peut avoir un sens, en fait il y a deux types de pages, les pages protégées et les pages non protégées. Les pages non protégés c’est a dire celle dont protect=0 sont disponibles partout alors que les pages protégées celle dont protect=1 ne sont disponibles que par certains utilisateurs.
Pour arrange ma requete il faudrait donc d’abord que je vérifie si la table droit est vide et si c’est le cas la virer de ma requete.
Tu peux difficilement faire autrement qu’en faisant une procédure stoquée pour ta requete. Droit c’est une table d’assoc, si ta rien dedans, tu peux rien associer !!
Cette requete aussi fonctionne bien et la table droit peut etre vide
SELECT DISTINCT nom FROM page
LEFT OUTER JOIN droit ON page.pid = droit.pid
LEFT OUTER JOIN user ON droit.uid = user.uid
WHERE (page.protect=0 OR (page.protect=1 AND user.name = 'ash'));