0

我正在尝试简化这个 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
4

1 回答 1

3

似乎您想知道书架上的许多书与第 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值似乎很奇怪,在这种情况下,它们都是错误的。

于 2020-10-20T03:01:55.607 回答