У меня есть две таблицы: 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')