MySQL "Für Jeden"
Ich versuche, stellen Sie eine code-Frage-website, wie CodeChef.
So weit, ich habe zwei Tabellen, problems
und submissions
.
problems
besteht aus einem einzigen id
Feld, welches auto_increment
ed. (Es hat wirklich mehr Felder, aber Sie sind nicht relevant.)
submissions
besteht aus einem id
Feld, welches auto_increment
ed, eine problem_id
Feld, welches foreign key
-ed problems.id
, und ein bool
correct
Feld.
Hier sind Ihre (vereinfachte) Schaffung Aussagen:
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)
);
Nun, was ich versuche zu tun, ist die folgende:
Für jeden id
im problems
, Zeile zurück, die aus der ID, die Anzahl der richtigen Einsendungen für das problem, und die Gesamtzahl der Einreichungen für dieses problem.
Im Grunde, ich möchte die folgende Abfrage verwenden:
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];
wo [problem_id]
geht über jeden id
im problems
.
Es scheint, wie ich brauchen, um eine sub-Abfrage, aber ich habe es versucht und es funktionierte nicht bei allen.
Wie erstelle ich eine Abfrage diese Ergebnisse?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ihre Abfrage hat einige Vorgaben.
inner
beitreten.Dies ist mein Vorschlag:
sum(s.correct)
stattsum(if(s.correct, 1, 0))
seittrue
gespeichert ist, als1
undfalse
gespeichert ist, als0
?left join
Punkt.sum(s.correct)
istnull
währendsum(if(s.correct, 1, 0))
ist0
, das ist, was ich will. Also deine Antwort ist sogar noch mehr richtig, als ich bisher dachte!select NULL + 0;
zurückNULL
, währendnull
wertetfalse
von selbst. (select if(null = true, 1, 0);
gibt 0 zurück)Alle, die Sie für Ihre Abfrage ist eine
group by
Klausel:versuchen