通过替换内部查询改进 SQL 查询

Improve SQL query by replacing inner query

我正在尝试简化此 SQL 查询(我用隐喻替换了真实的 table 名称),主要是摆脱了内部查询,但我的大脑冻结了无法思考有什么办法。

我最关心的(除了美观之外)是重负载下的性能

查询的目的是计算在任何特定书架上找到的所有按流派分组的书籍(因此内部查询有效地告诉在哪个书架上计算书籍)。

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 table 的值,有效地将其转换为 INNER JOIN。说到 JOIN,您可以 JOIN 而不是嵌套的 select.

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 table 的唯一原因是找到 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.idbook.genre_id 匹配是问题中的错字。这两个 table 共享相同的 id 值似乎很奇怪,在这种情况下它们都是错误的。