[英]MySQL query with multiple inner joins on same table
我有两个表: 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'
这将返回“My Thriller Book”和“My Thriller SciFi book”。 美好的
如果我只想要同时具有惊悚类型和科幻类型的书籍,我会有点卡住。 我可以这样做,但我想知道是否有没有子查询的更好方法。 我将来可能想要查询两个以上的类型,这将创建另一个子查询。
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')
您可以执行类似的操作并检查 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'
问候
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.