开发者

Is it possible to do an SQL query across two tables?

开发者 https://www.devze.com 2023-02-06 01:01 出处:网络
I have a couple tables that look like this: ______________________ Books|| Tags| |-----------||-----------|

I have a couple tables that look like this:

 ___________    ___________
| Books     |  | Tags      |
|-----------|  |-----------|
| book_id   |  | tag_id    |
| book_name |  | tag_name  |
 -----------    ----------- 

And a join table that connects the "many-to-many relationship":

 ___________
| Books/Tags|
|-----------|
| book_id   |
| tag_id    |
 -----------

I want to do a query that's kind of like this:

SELECT book_name, tag_name FROM books, tags WHERE tag_name = 'fiction'

Is 开发者_JAVA百科there any way to "attach" the books table to the tags in the query since they have a join table between them? Or do I have to do three queries, one to get the tag_id, another to get the book_id matching the tag_id, and a third to get the book_name matching the tag_id?


Yes you can do; with a 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';

This will return a list of books which have the 'fiction' tag.

Alternatively you can do it with subqueries:

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

Or:

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


Yes you can do this in one query, this is called a 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';


you will need to join all three 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';
0

精彩评论

暂无评论...
验证码 换一张
取 消