[Résolu]Requete Mysql


#1

Je doit récuperer certaines données sur une base mysql mais j’ai quelques difficultés avec ma requete.

Voici le schema relationnelle

[quote]user(uid, name, pwd, mail)
page(pid, nom, protect)
droit(#uid, #pid)
[/quote]

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


#2

[quote=“Ashgenesis”]Je doit récuperer certaines données sur une base mysql mais j’ai quelques difficultés avec ma requete.

Voici le schema relationnelle

[quote]user(uid, name, pwd, mail)
page(pid, nom, protect)
droit(#uid, #pid)
[/quote]

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);

#3

Merci ca marche impecc :slightly_smiling:

Pourquoi faire simple quand on peut faire compliquer :wink:


#4

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.


#5

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.


#6

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.


#7

fais 2 requetes:

Si la première ne passe pas,

selectione toute les pages protect=0

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 !! :stuck_out_tongue:


#8

J’ai fait deux requetes ca fonctionne correctement maintenant :slightly_smiling:

Merci de votre aide :stuck_out_tongue:


#9

'vec plaisir :stuck_out_tongue:


#10

Cette requete aussi fonctionne bien :slightly_smiling: 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'));