如何通过3表关联统计指定用户的全部爱好数量(含0值)
解决指定用户全爱好统计(含无关联爱好计数0)的问题
我来帮你修复这个SQL查询的问题~ 你原来的查询只返回有计数的爱好,核心原因是从referensi表开始关联,并且把用户过滤条件放在了WHERE子句里,导致没有关联的爱好被过滤掉了。
正确的SQL写法
我们需要以hobby表为基础(确保所有爱好都被包含),然后左连接该用户的关联记录,这样就能保留所有爱好,无关联的计数自然为0:
SELECT h.id, h.hobby, COUNT(r.id) AS count FROM hobby h LEFT JOIN referensi r ON h.id = r.ref_hobby AND r.ref_person = 1 -- 把用户ID条件放在JOIN的ON子句里,而非WHERE GROUP BY h.id, h.hobby ORDER BY h.id;
为什么这样写有效?
- 以
hobby表作为主表:确保所有爱好都会出现在结果集中,不管有没有用户关联记录。 - 左连接
referensi并在ON子句中过滤用户:只会匹配当前用户的关联记录,没有关联的爱好对应的r.id会是NULL,COUNT(r.id)会忽略NULL值,从而统计为0。 - GROUP BY包含hobby的所有非聚合字段:避免因数据库的分组规则(比如MySQL的
ONLY_FULL_GROUP_BY)导致的语法错误。
如果想用用户名查询(而非ID)
可以改成这样,通过子查询获取用户ID:
SELECT h.id, h.hobby, COUNT(r.id) AS count FROM hobby h LEFT JOIN referensi r ON h.id = r.ref_hobby AND r.ref_person = (SELECT id FROM person WHERE name = 'Rose') GROUP BY h.id, h.hobby ORDER BY h.id;
测试结果示例
查询Rose(ID=1)时,结果会是:
| id | hobby | count |
|---|---|---|
| 1 | Makan | 1 |
| 2 | Renang | 0 |
| 3 | Nyanyi | 1 |
| 4 | Youtube | 1 |
| 5 | Masak | 0 |
查询Jisoo(ID=3)时,结果会是:
| id | hobby | count |
|---|---|---|
| 1 | Makan | 0 |
| 2 | Renang | 0 |
| 3 | Nyanyi | 0 |
| 4 | Youtube | 0 |
| 5 | Masak | 1 |
内容的提问来源于stack exchange,提问作者Denny Kurniawan
相关产品推荐
相关产品推荐

