[RESOLU] Retourner les ID différents de...

Eléphant du PHP | 67 Messages

16 oct. 2014, 15:11

Bonjour,

J'ai un souci avec une requête SQL qui ne fonctionne que dans un sens...
Dans le principe j'ai 3 tables:
- Recettes
- Types
- Personnes_recettes qui fait la relation entre les personnes et les recettes qui leur ont déjà été faites. (par exemple l'IDPersonne 17 va avec le plat d'ID 10)

Je veux faire une requête qui soit me retourne tous les plats faits pour une personne, soit l'inverse, les plats pas encore fait pour une personne.
SELECT DISTINCT r.id, r.titre, r.id_type, t.type FROM recettes r, personnes_recettes p, types t WHERE p.id_personne='18' AND r.id=p.id_recette AND t.id=r.id_type
Si je laisse "r.id=p.id_recette" il me sort bien le résultat qu'il faut
En revanche si je mets "r.id!=p.id_recette", alors là il me sort tous les résultats, même ceux qui sont égaux

Une idée?

merci!

Petit nouveau ! | 8 Messages

16 oct. 2014, 16:40

Salut,

Si j'ai bien compris ce que tu cherches à faire, la bonne requête serait plutôt :
SELECT DISTINCT r.id, r.titre, r.id_type, t.type FROM recettes r, personnes_recettes p, types t WHERE p.id_personne!='18' AND r.id=p.id_recette AND t.id=r.id_type

Petit nouveau ! | 8 Messages

16 oct. 2014, 17:14

Hum non en fait la requête que j'ai proposée provoquera la même erreur :(

Une autre solution sera peut-être de passer par une sous-requête plutôt qu'une jointure, exemple :
SELECT DISTINCT r.id, r.titre, r.id_type, t.type FROM recettes r, types t WHERE  r.id_recette not in (SELECT DISTINCT id_recette from personnes_recettes where id_personne='18')  AND r.id=p.id_recette AND t.id=r.id_type
A tester...

Ou bien regarder du côté des jointures de type "LEFT JOIN" et "RIGHT JOIN"
Un bon tuto : http://www.epershand.net/developpement/ ... join-mysql

Mammouth du PHP | 571 Messages

16 oct. 2014, 17:27

une autre proposition
SELECT DISTINCT r.id, r.titre, r.id_type, t.type FROM recettes r
JOIN types t ON t.id=r.id_type
LEFT JOIN personnes_recettes p ON r.id=p.id_recette
WHERE p.id_recette IS NULL OR p.id_recette=''
AND p.id_personne=18

Eléphant du PHP | 67 Messages

17 oct. 2014, 10:26

Merci pour ces réponses.
J'ai modifié un peu la première solution car elle ne fonctionnait pas directement (pas facile sans avoir les tables sous les yeux ;)).

Voici une requête qui fonctionne au poil:
SELECT DISTINCT r.id, r.titre, r.id_type, t.type FROM recettes r, types t WHERE r.id NOT IN (SELECT DISTINCT id_recette FROM personnes_recettes WHERE id_personne=17) AND t.id=r.id_type ORDER BY t.ordre ASC, r.titre ASC
Merci beaucoup!
Je vais aller lire le tuto sur les jointures car ça a toujours été mon problème ça, et je vais en avoir sérieusement besoin pour la suite de mon projet...

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

17 oct. 2014, 11:14

Modération :
Si ta question est résolue, pense à l'indiquer pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.
Tu peux réaliser cette opération toi-même en cliquant sur le bouton vert "Mettre le sujet en tant que Résolu" situé en haut de la page à côté du titre du sujet.
Il en faut peu pour être heureux ......

Eléphant du PHP | 67 Messages

17 oct. 2014, 14:51

Autant pour moi je n'avais pas fait attention qu'il y avait un tel bouton.