Можно ли сделать запрос SQL для двух таблиц? - PullRequest
0 голосов
/ 23 января 2011

У меня есть пара таблиц, которые выглядят так:

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

И таблица соединений, которая связывает «отношение многих ко многим»:

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

Я хочу сделать запрос вроде этого:

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

Есть ли способ "прикрепить" таблицу книг к тегам в запросе, поскольку между ними есть таблица соединения? Или мне нужно выполнить три запроса: один для получения tag_id, другой для получения book_id, совпадающего с tag_id, и третий для получения book_name, совпадающего с tag_id?

Ответы [ 3 ]

4 голосов
/ 23 января 2011

Да, вы можете сделать; с СОЕДИНЕНИЕМ:

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

Будет возвращен список книг с тегом «беллетристика».

В качестве альтернативы вы можете сделать это с помощью подзапросов:

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

Или:

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'
)
2 голосов
/ 23 января 2011

Да, вы можете сделать это одним запросом, это называется 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';
0 голосов
/ 23 января 2011

вам нужно будет объединить все три стола

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';
...