多表关联的自连接查询结果异常问题求助
修正你的SQL查询:获取书籍名称及关联页面数量
我来帮你搞定这个查询问题~先看看你原SQL里的几个问题,再给出正确的写法:
原SQL的问题点
- 混合使用了旧的逗号表连接和
INNER JOIN,导致attributes b和attributes p之间没有关联条件,产生了不必要的笛卡尔积,结果自然不对 - 拼写错误:
groub by应该是group by - 统计逻辑有误:你试图通过关联页面的Attributes记录来统计数量,但其实不需要绕这一步,直接通过Book表的关联关系就能统计页面数
正确的SQL写法
根据你的表结构和需求,我们可以这样写:
SELECT attr_book.VALUE AS "book", COUNT(book.PID) AS "PAGE COUNT" FROM Attributes attr_book LEFT JOIN Book ON attr_book.ID = Book.BID WHERE attr_book.KEY = 'A' GROUP BY attr_book.VALUE;
逻辑解释
- 先从
Attributes表中筛选出书籍属性记录:通过attr_book.KEY = 'A'拿到所有书籍的ID(对应Book表的BID)和名称(VALUE) - 用
LEFT JOIN关联Book表:通过书籍ID(attr_book.ID = Book.BID)拿到该书籍对应的所有页面PID - 统计页面数量:
COUNT(book.PID)会统计每个书籍关联的页面总数,用LEFT JOIN的好处是如果某本书没有关联页面,也会显示出来,数量为0(如果不需要这种情况,换成INNER JOIN即可)
针对你的示例数据的结果
用你给出的示例数据执行这个SQL,会得到预期的结果:
| book | PAGE COUNT |
|---|---|
| Book1 | 2 |
另外补充一下:你的Page表和Book表是反向关联的,其实两者存储的是同一组关联关系,查询时只用其中一张表就够啦,不需要同时使用。
内容的提问来源于stack exchange,提问作者EricT
相关产品推荐
相关产品推荐

