我有一个这样的数据库:
问题表:
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)。
答案 0 :(得分:0)
嗯。 。 。假设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;
答案 1 :(得分:0)
您可以结合使用LEFT JOIN
和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