# \[Résolu\]Requete Mysql

**URL:** <https://www.debian-fr.org/t/resolu-requete-mysql/3290>\
**Category:** Programmation\
**Created:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290 "2016-02-20T12:45:09Z")\
**Posts on this page:** 10\
**Page:** 1

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/1 "2016-02-20T12:45:09Z")

</div>

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`

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/2 "2016-02-20T12:45:10Z")

</div>

[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

```auto
SELECT nom FROM page, user, droit WHERE droit.uid = user.uid AND page.pid = droit.pid AND (p.protect = 0 OR u.name = ash);
```

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/3 "2016-02-20T12:45:10Z")

</div>

Merci ca marche impecc 🙂

Pourquoi faire simple quand on peut faire compliquer 😉

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/4 "2016-02-20T12:45:11Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Damsss](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/d/43a26b/32.png) [@Damsss](https://www.debian-fr.org/u/Damsss)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/5 "2016-02-20T12:45:11Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/6 "2016-02-20T12:45:11Z")

</div>

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.

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/7 "2016-02-20T12:45:12Z")

</div>

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 !! 😛

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/8 "2016-02-20T12:45:12Z")

</div>

J’ai fait deux requetes ca fonctionne correctement maintenant 🙂

Merci de votre aide 😛

---

<div class="post-metadata">

**Author:** ![ed](https://www.debian-fr.org/user_avatar/www.debian-fr.org/ed/32/5886_2.png) [@ed](https://www.debian-fr.org/u/ed)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/9 "2016-02-20T12:45:12Z")

</div>

'vec plaisir 😛

---

<div class="post-metadata">

**Author:** ![Ashgenesis](https://www.debian-fr.org/letter_avatar_proxy/v4/letter/a/57b2e6/32.png) [@Ashgenesis](https://www.debian-fr.org/u/Ashgenesis)\
**Post date:** [Février 20, 2016, 12:45 UTC](https://www.debian-fr.org/t/resolu-requete-mysql/3290/10 "2016-02-20T12:45:43Z")

</div>

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