Est-il possible de faire une requête SQL sur deux tableaux?
-
23-10-2019 - |
Question
J'ai quelques tables qui ressemblent à ceci:
___________ ___________ | Books | | Tags | |-----------| |-----------| | book_id | | tag_id | | book_name | | tag_name | ----------- -----------
Et une table de jointure qui relie le "many-to-many":
___________ | Books/Tags| |-----------| | book_id | | tag_id | -----------
Je veux faire une requête qui est un peu comme ceci:
SELECT book_name, tag_name FROM books, tags WHERE tag_name = 'fiction'
Est-il possible de « fixer » la table des livres pour les balises dans la requête, car ils ont une table de jointure entre eux? Ou dois-je faire trois requêtes, une pour obtenir le tag_id, un autre pour obtenir le book_id correspondant à la tag_id, et un troisième pour obtenir le book_name correspondant à la tag_id?
La solution
Oui, vous pouvez le faire; avec un JOIN:
SELECT b.book_name, t.tag_name FROM books b
JOIN books_tags bt ON bt.book_id=b.book_id
JOIN tags t ON t.tag_id=bt.tag_id
WHERE t.tag_name = 'fiction';
Ceci renvoie une liste de livres qui ont l'étiquette « fiction ».
Sinon, vous pouvez le faire avec les sous-requêtes:
SELECT b.book_name FROM books b WHERE id IN (
SELECT bt.book_id FROM books_tags bt
WHERE bt.tag_id IN (
SELECT t.tag_id FROM tags t WHERE t.tag_name='fiction'
)
)
Ou:
SELECT b.book_name FROM books b WHERE EXISTS (
SELECT 1 FROM books_tags bt
JOIN tags t ON t.tag_id=bt.tag_id
WHERE t.tag_name='fiction'
)
Autres conseils
Oui, vous pouvez le faire dans une requête, on appelle cela un JOIN
:
SELECT book_name, tag_name FROM books
JOIN bookTags ON books.book_id = bookTags.book_id
JOIN tags ON booksTags.tag_id = tags.tag_id
WHERE tag_name = 'fiction';
vous devrez joindre les trois tables
SELECT books.book_name, books.tag_name FROM books, bookTags, Tags
WHERE books.book_id = bookTags.book_id
AND booksTags.tag_id = Tags.tag_id
and Tag.tag_name = 'fiction';