Sql 如何修复trac报告中的双左联接
我们使用定制版本的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
严重性
和重要性
为简单起见,假设数据库包含以下表:
表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
,您只需在平均计算列中重复这些语句即可。谢谢!最后,我用类似的方法解决了这个问题,用一个子选择代替了左连接