2013-12-18 83 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;