繁体   English   中英

MySQL 查询在同一个表上有多个内部连接

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM