2013-12-18 57 views
0

我正在尝试制作代码问题网站,例如CodeChefMySQL“For Each”

到目前为止,我有两个表,problemssubmissions

problems由单个id字段组成auto_increment ed。 (它确实有更多的领域,但它们是不相关的。)

submissions由一个id场是auto_increment版,一个problem_id场是foreign key -ed到problems.idboolcorrect领域。

这是他们(简体)创建语句:

create table problems 
(
    id bigint auto_increment primary key not null, 
    /* more fields that are unimportant */ 
); 
create table submissions 
(
    id bigint auto_increment primary key not null, 
    problem_id bigint not null, 
    correct bool not null, 
    /* more fields */ 

    foreign key (problem_id) references problems(id) 
); 

现在,我想要做的是以下几点:

对于每个idproblems,返回一行由该ID的,该问题的正确提交数量以及该问题的提交总数。

基本上,我想用下面的查询:

select 
    problems.id, 
    sum(submissions.correct), 
    count(submissions.id) 
from submissions inner join problems 
on submissions.problem_id=problems.id and problems.id=[problem_id]; 

其中[problem_id]越过在problemsid

看来我需要使用子查询,但我尝试了它,它根本不起作用。

如何创建一个查询来返回这些结果?

回答

1

您的查询有一定的默认值。

  • 你不为你使用
  • 你加入聚集指定分组标准,这是一个“每个”本身。除了已经指定的连接条件,您不需要其他任何东西
  • 您的连接应该是左连接,因为可能没有正确提交您的问题,如果连接为inner,则结果为0。

这是我的建议:

SELECT 
    p.id, 
    SUM(IF(s.correct, 1, 0)) AS correct_submissions, 
    COUNT(s.id) AS total_submissions 
FROM problems p 
     LEFT JOIN submissions s ON p.id = s.problem_id 
GROUP BY 
    p.id 
+0

纠正我,如果我错了,但我不能只使用,而不是''之总和(s.correct)'(如果(s.correct ,1,0))'因为'true'存储为'1','false'存储为'0'? – Jashaszun

+1

尽管我最喜欢你的答案,因为你也碰到了“左连接”点。 – Jashaszun

+0

我尝试避免布尔类型,所以我不能回答你的问题。试试吧:) – Sebas

0

尝试

select 
problems.id, 
sum(submissions.correct), 
count(submissions.id) 
from submissions inner join problems 
on submissions.problem_id=problems.id 
where problems.id=[problem_id] 
group by problems.id; 
0

所有您需要为您查询是group by条款:

select problems.id, 
     sum(submissions.correct), 
     count(submissions.id) 
from submissions inner join 
    problems 
    on submissions.problem_id=problems.id 
group by problems.id;