Bonsoir à tous, Je ne sais si c'est possible en une seule requette , je vous expose mon probleme;

En partant du principe que je possede 3 tables:
une table: books
une table: users
une table de liaison: books_users

la table books_users se decompose comme ceci:
(int)books_id, (int)users_id, (boolean) possede

Je veux recuperer tous les titres de livres que possede jean (id=1)

SELECT titre FROM books b
INNER JOIN books_users  bu ON bu.books_id =  b.id
WHERE bu.users_id = 1
AND bu.possede = 1

Jusque là, pas de probleme, la ou ca se complique et ou je ne trouve pas la solution, c'est si je veux afficher tous les livres que possede jean avec en mm temps pour chaque livre recupere, l'info si eric(id=2) possede ce livre.

Merci d'avance pour vos lanternes

2 réponses


arnich
Réponse acceptée

Dans ton cas tu peux faire une jointure externe

SELECT * FROM books b
INNER JOIN books_users bu ON bu.books_id =  b.id
LEFT JOIN books_users bu2 ON bu2.books_id = b.id and bu2.users_id = 2
WHERE bu.users_id = 1

Ainsi tu va récupérer tous les livres que possède le user avec l'id 1
Si le user avec l'id 2 possède le livre bu2.id sera différent de null.

Ps : A quoi sert le champ possède ?

driven78
Auteur

Génial, tu m'as mis sur la voie, me doutais bien qu'il fallait que je passe par une jointure, le pire c'est que je l'ai mis dans le titre, en fait j'ignorais que l'on pouvais faire de multiples jointure sur la mm table et que l'on pouvais lui mettre des clauses

Ce qui donnerai donc pour mon exemple:

SELECT b.titre, bu2.* FROM books b
INNER JOIN books_users bu ON bu.books_id =  b.id
LEFT JOIN books_users bu2 ON bu2.books_id = b.id and bu2.users_id = 2
WHERE bu.users_id = 1
AND bu.possede = 1

et pour répondre a ta question, la table de liaison est une table de liaison généraliste, c'est a dire que je peux gerer l'interaction entre mes deux tables sur un seul enregistrement, et lui notifier plusieurs actions; posseder lu bruler preter etc

En te remerciant