如何解决通过替换内部查询来改进SQL查询
我正在尝试简化此SQL查询(我用隐喻替换了真实的表名),主要是摆脱了内部查询,但是我被冻僵了,想不出任何办法。
该查询的目的是根据在保存该书的任何特定书架上找到的所有书目按流派分组(因此内部查询可以有效地判断要对哪个书进行计数)。
SELECT g.name,count(s.book_id) occurances FROM genre g
LEFT JOIN shelve s ON g.shelve_id=s.id
WHERE s.id=(SELECT genre_id FROM book WHERE id=111)
GROUP BY s.genre_id,g.name
解决方法
您似乎想知道书架上的许多书籍与第111本书属于同一类型:如果您喜欢“ X”一本书,则库存中有这么多类似的书籍。
我注意到的一件事是原始文档中的WHERE
子句需要shelve
表的值,从而有效地将其转换为INNER JOIN。说到JOIN,您可以加入JOIN而不是嵌套选择。
SELECT g.name,count(s.book_id) occurances
FROM genre g
INNER JOIN shelve s ON s.id = b.shelve_id
INNER JOIN book b on b.genre_id = s.id
WHERE b.id=111
GROUP BY g.id,g.name
更多考虑,我可能也从book
开始而不是genre
。最后,根本不需要genre
表的唯一原因就是找到name
,因此id
与之匹配可能更有效。
SELECT g.name,count(s.book_id) occurances
FROM book b
INNER JOIN shelve s ON s.id = b.genre_id
INNER JOIN genre g on g.shelve_id = s.id
WHERE b.id=111
GROUP BY g.id,g.name
不确定它们是否符合您的“简单”概念,但它们是替代方法。
...,除非将shelve.id
与book.genre_id
匹配是该问题的错别字。这两个表共享相同的id
值似乎很奇怪,在这种情况下,它们都将是错误的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。