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