【问题标题】:Flatten count with one to many relationship用一对多关系扁平化计数
【发布时间】:2015-08-06 18:27:58
【问题描述】:

我有两个表,PersonHobby,具有一对多的关系。

| ID | Person |     | ID | PersonID | Hobby      |   
|----|--------|     |----|----------|------------|
| 1  | Bob    |     | 1  | 1        | Skiing     |
| 2  | Mike   |     | 2  | 2        | Biking     |  
| 3  | Frank  |     | 3  | 3        | Skiing     |
                    | 4  | 1        | Numerology |
                    | 5  | 2        | Witchcraft |
                    | 6  | 3        | Stamps     |

我想制作一个表格,其中包含每个喜欢滑雪或邮票的人的单次计数。 像这样的:

| Person | Count |
|--------|-------|
| Bob    | 1     |
| Frank  | 1     |

一个有效的 sql 查询是什么样的?

【问题讨论】:

标签: sql


【解决方案1】:
select p.person, count(p.id) as cnt
from person p join hobby h
on h.personid = p.id
where h.hobby = 'Skiing'
group by p.person

您必须加入表格并group by 个人 ID。

【讨论】:

  • 如果它可以等于滑雪或骑自行车,但我仍然只想数一次呢?
  • 你可以使用in子句hobby in ('Skiing','Biking')
  • 这给了我重复的计数。如果他们喜欢 Where 子句中过滤的任何爱好,我只想算一次。
【解决方案2】:

这解决了它。你需要计算不同的

SELECT p.person, count(Distinct p.id) as Count
FROM person p join hobby h
   ON h.personID = p.ID
WHERE h.hobby = 'Skiing' 
   OR h.hobby = 'Stamps'
GROUP BY p.ID

【讨论】:

    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-04
    • 2019-04-23
    • 1970-01-01
    相关资源
    最近更新 更多