通过替换内部查询改进 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.id
与 book.genre_id
匹配是问题中的错字。这两个 table 共享相同的 id
值似乎很奇怪,在这种情况下它们都是错误的。
我正在尝试简化此 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.id
与 book.genre_id
匹配是问题中的错字。这两个 table 共享相同的 id
值似乎很奇怪,在这种情况下它们都是错误的。