【问题标题】:How to sum and group a table by a specific column如何按特定列对表进行汇总和分组
【发布时间】:2020-05-24 15:21:35
【问题描述】:

我有一个这样的数据库:
题表:

QId | Title
----------
1   | SR
4   | TR
9   | AA

答案表:

RId | QId
----------
2   | 1
3   | 1
5   | 4
6   | 4
7   | 1
8   | 4

投票表:

PubId | Type
-------------
2     | P
3     | N
3     | N
1     | P
1     | N
5     | P
4     | P
2     | N
2     | P

我想计算每个问题的分数。一个问题的得分是对该问题及其所有答案的正面和负面投票之间的差异。例如,QId 为 1 的问题 1(答案为 2、3 和 7)的得分为 -1,因为它有 3 个赞成票和 4 个反对票。
到目前为止,我只能计算给定问题的分数。代码是:

SELECT P+N FROM (
SELECT sum (case WHEN Type='P' then +1 else 0 end) as P,
sum (case WHEN Type='N' then -1 else 0 end) as N
from ( 
SELECT v.Type from Vote v where v.PubId in (
SELECT r.RId FROM Answer r WHERE r.QId=4
UNION
select q.QId from Question q where q.QId=4)
)
)

如何计算每个问题的分数,然后将它们从分数最高的问题到分数最低的问题排序?

我想要的结果是4(得分为+2)、9(得分为0)、1(得分为-1)。

【问题讨论】:

  • pubid 指的是什么?
  • 你如何定义积极投票和消极投票。我只看到问题 1 有 2 票赞成票和 3 票反对票
  • 如果您查看答案表,@JimMacaulay 问题 1 的答案为 2,3 和 7。因此,我们查看 PubId = 1、2、3 和 7 的投票表。这给了我们 4 N 和 3 P
  • @GordonLinoff pubId 指的是 Question 表中的 QId 或 Answer 表中的 RId

标签: mysql sql sorting sum


【解决方案1】:

您可以使用LEFT JOINs 结合CASE 来计算分数。例如:

select
  *
from (
  select
    q.qid,
    sum(case when v.type = 'P' then 1 
             when v.type = 'N' then -1 else 0 end
       ) as score
  from question q
  left join answer a on a.qid = q.qid
  left join vote v on v.pubid = a.rid
  group by q.qid
) x
order by score desc

【讨论】:

    【解决方案2】:

    嗯。 . .假设pubid匹配rid,这基本上只是条件聚合:

    select a.qid,
           sum(type = 'P') - sum(type = 'N') as score
    from answer a join
         vote v
         on v.pubid = r.rid
    group by a.qid;
    

    根据评论编辑:

    select q.qid,
           coalesce(sum(type = 'P'), 0) - coalesce(sum(type = 'N'), 0) as score
    from question q left join
         answer a
         on q.qid = a.quid left join
         vote v
         on v.pubid = r.rid
    group by q.qid
    order by score desc;
    

    【讨论】:

    • 感谢您的回复。通过执行此操作,我们不会考虑 QId 9 的问题得分为 0。没有正面或负面投票。我们只考虑有答案的问题,而不考虑没有答案的问题,例如 QId 9 的问题
    • @Mohammadreza 。 . .从你的问题中并不清楚。但我正在添加我认为是一个简单解决方案的修改。
    猜你喜欢
    • 2021-12-26
    • 1970-01-01
    • 2011-03-12
    • 1970-01-01
    • 2018-03-23
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    相关资源
    最近更新 更多