私は学校のディベートデータベースを持っており、各学校が過去5回のディベートで平均したスコアを確認したいと思っています。学校がディベートを主催している場合、スコアはhostscoreという列に記録され、訪問している場合は、visitscoreにスコアが記録されます。
これは私が扱っているデータの抜粋です
CREATE TABLE schools (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(255)
) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
CREATE TABLE debates (
debateid INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
debatedate DATE NOT NULL,
hostid INT,
visitid INT,
hostscore INT,
visitscore INT
) DEFAULT CHARACTER SET utf8 ENGINE=InnoDB;
私が行った場合
SELECT debates.debateid, DATE_FORMAT(debates.debatedate,'%m-%d') AS DATE, school1.name AS HOST, school2.name AS VISITOR, debates.hostscore, debates.visitscore
FROM debates
INNER JOIN schools as school1 ON debates.hostid=school1.id
INNER JOIN schools as school2 ON debates.visitid=school2.id
WHERE ((school1.id = 1 OR school2.id =1) ) AND debatedate < CURDATE()
ORDER BY debatedate DESC LIMIT 0 , 5
私は彼らの最後の5つの議論を見ることができます。
私が以下を行う場合。
SELECT visitid,
(
SELECT
(
((SELECT sum(visitscore) FROM debates WHERE (visitid=1) AND debatedate < CURDATE()) + (SELECT sum(hostscore) FROM debates WHERE (hostid=1) AND debatedate < CURDATE()))
/
(SELECT COUNT(*) FROM debates WHERE ((visitid=1)or(hostid=1)) AND debatedate < CURDATE())
)
FROM debates
INNER JOIN schools as school1 ON debates.hostid=school1.id
INNER JOIN schools as school2 ON debates.visitid=school2.id
LIMIT 0,1
)
AS AVGSCORE
FROM debates
WHERE visitid=1
LIMIT 0,1
その年の討論ごとの平均スコアを見ることができます。
しかし、最後の5つの(全体的な)討論を表示する方法を理解することはできません(以下のデータでhostid=1とvisitid=1の平均)
----------------------------------------------------------------------
|DEBATEID |DATE |HOST |VISITOR |HOSTSCORE |VISITSCORE |
|20 |09-22 |St Luke |St Thomas |82 |84 |
|16 |08-22 |St Thomas |St Simon |91 |88 |
|15 |08-12 |St Luke |St Thomas |75 |64 |
|11 |07-12 |St Thomas |St Simon |72 |64 |
|10 |06-28 |St Luke |St Thomas |82 |84 |
----------------------------------------------------------------------
手動で作業すると、この例の結果は79になります。ここでいくつかのことを試しました。これは良さそうだと思いましたが、私が探しているものにはほど遠い結果が得られます。私は何が間違っているのですか?テストデータについては、このSQLFiddleを参照してください
SELECT sum(visitid),
(SELECT
(
(
(SELECT sum(visitscore) FROM (SELECT visitscore FROM debates WHERE (hostid=1) AND debatedate < CURDATE() ORDER BY debatedate DESC LIMIT 0,5) as awayavgpg1)
+
(SELECT sum(visitscore) FROM (SELECT visitscore FROM debates WHERE (visitid=1) AND debatedate < CURDATE() ORDER BY debatedate DESC LIMIT 0,5) as awayavgpg2)
)
/
(SELECT COUNT(*) FROM (SELECT * FROM debates WHERE (hostid=1) or (visitid=1) AND debatedate < CURDATE()LIMIT 0,5) as awayavgpg3)
)
FROM debates
LIMIT 0,1) AS AVSCORE
FROM debates
WHERE visitid=1
LIMIT 0,1