2013-03-22 31 views
1

我有一个学校辩论数据库,我希望能够看到每个学校在过去5次辩论中的平均分数。如果学生举办辩论,那么如果他们正在访问他们的分数进入访问核心,那么得分会被记录在一个名为hostscore的列中。MySQL最后x次结果的平均值,其结果可以在不同的列中

这是数据的提取物我与

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(总)辩论(AVG的主机标识哪里= 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.我在这里尝试了很多东西。我认为这看起来不错,但它产生的结果是没有我正在寻找的附近。我究竟做错了什么?看到这个SQL Fiddle测试数据

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 

回答

2

使用UNION的列合并为一个:对你有所帮助

SELECT AVG(score) avscore 
FROM (SELECT debatedate, score 
     FROM (SELECT debatedate, hostscore score 
      FROM debates 
      WHERE hostid = 1 
      UNION 
      SELECT debatedate, visitscore score 
      FROM debates 
      WHERE visitid = 1) x 
     ORDER BY debatedate DESC 
     LIMIT 5) y 
+0

哇你已经看起来那么简单,谢谢! – ak85 2013-03-22 09:36:30

+0

+1能够理解问题:) – Vatev 2013-03-22 09:37:29