MySQL запрос с несколькими внутренними соединениями в одной таблице - PullRequest
0 голосов
/ 29 мая 2020

У меня есть две таблицы: tblBooks и tblBookMeta

tblBookMeta содержит жанры книг, и их может быть больше одной.

Используя этот запрос, я получаю все результаты, как показано.

SELECT * FROM tblBooks as B inner join tblBookMeta as BM ON B.BookId = BM.BookId 

tblBooks                           tblBookMeta
BookId  Title                   |  BookMetaId   BookId  MetaName    MetaValue   
1       My Thriller Book        |  1            1       Genre       Thriller    
2       My SciFi Book           |  2            2       Genre       SciFi   
3       My Thriller SciFi Book  |  3            3       Genre       Thriller    
3       My Thriller SciFi Book  |  4            3       Genre       SciFi   

Чтобы запросить книги по жанрам, я могу использовать этот запрос

SELECT * FROM tblBooks as B
inner join tblBookMeta as BM ON B.BookId = BM.BookId 
WHERE MetaName = 'Genre' and MetaValue = 'Thriller'

Это вернет «Моя книга триллеров» и «Моя научная книга триллеров». Отлично

, если мне нужны только книги, в которых есть и триллеры, и жанры научной фантастики, я немного застряну. Я могу сделать это так, но мне интересно, есть ли лучший способ без подзапросов. Возможно, в будущем я захочу запросить более двух жанров, что приведет к созданию другого подзапроса.

SELECT * FROM tblBooks as B
inner join tblBookMeta as BM ON B.BookId = BM.BookId 
WHERE MetaName = 'Genre' and MetaValue = 'Thriller' 
and B.BookId in (SELECT B.BookId FROM tblBooks as B
    inner join tblBookMeta as BM ON B.BookId = BM.BookId 
    WHERE MetaName = 'Genre' and MetaValue = 'SciFi') 

1 Ответ

1 голос
/ 29 мая 2020

Вы можете сделать что-то вроде и проверить с помощью EXPLAIN ANALYZE лучшее решение.

SELECT 
    *
FROM 
  tblBooks as B inner join tblBookMeta as TH
    ON (B.BookId = TH.BookId and TH.MetaValue = 'Thriller')
  inner join tblBookMeta as SC
    ON (B.BookId = SC.BookId and SC.MetaValue = 'SciFi')
WHERE 
    MetaName = 'Genre'

С уважением

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...