如何按特定列对表进行汇总和分组

时间:2020-05-24 15:21:35

标签: mysql sql sorting sum

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

Fragment fragment = getSupportFragmentManager().findFragmentById(R.id.fragment_container);
        if (fragment instanceof FormCallbacks) {
            FormCallbacks callbacks = (FormCallbacks) fragment;
            String userName = callbacks.getUserName();
            String address = callbacks.getAddress();
            String phone = callbacks.getPhone();
        }

答案表:

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

投票表:

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

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

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

如何计算每个问题的分数,然后从得分最高的问题到得分最低的问题进行排序?

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

2 个答案:

答案 0 :(得分:0)

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

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;

答案 1 :(得分:0)

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

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
相关问题