Sql 如何修复trac报告中的双左联接

Sql 如何修复trac报告中的双左联接,sql,join,trac,Sql,Join,Trac,我们使用定制版本的trac,人们可以根据两个标准对缺陷进行评分,我们称之为严重性和重要性 为简单起见,假设数据库包含以下表: 表ticket id | title | reporter 1 | SQL injection | Torvalds 2 | Buffer Overflow | Linus 3 | Localization | bofh 表投票 ticket_id | value | type | voter 1 | 4

我们使用定制版本的trac,人们可以根据两个标准对缺陷进行评分,我们称之为
严重性
重要性

为简单起见,假设数据库包含以下表:

ticket

id | title           | reporter
1  | SQL injection   | Torvalds
2  | Buffer Overflow | Linus
3  | Localization    | bofh
投票

ticket_id | value | type       | voter
1         | 4     | severity   | Linus
1         | 2     | severity   | Torvalds
1         | 3     | severity   | bofh
1         | 4     | importance | Linus
1         | 3     | importance | Torvalds
2         | 4     | severity   | Linus
2         | 2     | severity   | Torvalds
2         | 1     | importance | Linus
2         | 1     | importance | bofh
3         | 1     | importance | Linus
例如,第一行表示用户
Linus
建议4作为罚单#1的严重性分数

现在,我在trac报告中有以下SQL查询,用于获取平均分数:

SELECT t.title, t.reporter, AVG(vs.value), AVG(vi.value), COUNT(vs.value), COUNT(vi.value)
FROM ticket t
LEFT JOIN votes vs ON vs.type = 'severity'   AND vs.ticket_id=t.id
LEFT JOIN votes vi ON vi.type = 'importance' AND vi.ticket_id=t.id;
我希望,这将返回一个具有以下值的表:

title | reporter | severity avg | importance avg | number of sev. votes | number of imp. votes
SQL injection | Torvalds | 3 | 3.5 | 3 | 2
告诉我有多少人投了票,他们的票是多少

但是,由于
LEFT JOIN
的工作方式,我得到的条目是严重性和重要性投票的笛卡尔乘积,因此平均值仍然有效,而两个计数都设置为3x2=6,而不是正确的值


是否有一种简单的方法来修复此查询,使其返回我想要的内容?

将CASE语句与聚合函数结合起来:

SELECT 
  t.title, 
  t.reporter, 
  SUM(CASE WHEN v.type = 'importance' THEN 1 ELSE 0 END) AS Count_Imp,
  SUM(CASE WHEN v.type = 'severity' THEN 1 ELSE 0 END) AS Count_Sev,
  SUM(CASE WHEN v.type = 'importance' THEN v.value ELSE 0 END) / 
    Count_Imp AS Avg_Imp,
  SUM(CASE WHEN v.type = 'severity' THEN 1 ELSE 0 END) / 
    Count_Sev AS Avg_Sev
FROM 
  ticket t
  LEFT JOIN votes v 
  ON v.ticket_id = t.id;

如果Trac SQL不允许您重复使用别名
Count\u Imp
Count\u Sev
,您只需在平均计算列中重复这些语句即可。

谢谢!最后,我用类似的方法解决了这个问题,用一个子选择代替了左连接