我正在使用MYSQL和PHP来进行服务器端脚本编写。我无法尝试构建一个查询,该查询汇总了一些需要与审核对象相关的一些评论数据。
我有两张桌子。其中一个称为“学校”,其中包含有关学校的一般信息,另一个称为“评论”,用户提供的评论信息。
学校表的结构如下:
id,schoolName,schoolCity,schoolCountry(用于字段名称)
使用示例返回数据:
1,ASD,迪拜,阿联酋
2,DAA,迪拜,阿联酋
等
“评论”表格有57列:
RID,schoolID,profileID,dateCreated,Q1,Q2,Q3,... Q51,Q52,freeReview(作为字段名称)
返回的数据如下:
1,8,55,2012-10-10 05:16:05,10,8,9,2,3 ....
从Q1到Q25,这些是评论表格中的问题,以0-10之间的整数返回。其他列绑定到配置文件表和学校表(如上所述)。
我能够为一所学校创建一个查询,该查询为所选学校提供所有评论,并根据为该学校提交的评论数量生成学校的平均分数。
我遇到的问题是,我想创建一个页面,列出所有(按分页划分)表中的学校的平均和SUM-ed分数。
这是我的查询,可以生成学校的整体平均分数。
$singlereviewtotal = mysql_query("
SELECT ROUND(
((SUM(Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15+
Q16+Q17+Q18+Q19+Q20+Q21+Q22+Q23+Q24+Q25+Q26+Q27+Q28+Q29+Q30+
Q31+Q32+Q33+Q34+Q35+Q36+Q37+Q38+Q39+Q40+Q41+Q42+Q43+Q44+Q45+
Q46+Q47+Q48+Q49+Q50+Q51+Q52)/((52*10)*
(SELECT COUNT(*) FROM reviews WHERE schoolID='$schoolvalue')))*10), 2)
AS total
FROM reviews
WHERE schoolID='$schoolvalue'") or die(mysql_error());
这会生成所有列和行的正确求和值和平均值,舍入为2位小数。 WHERE子句来自页面中的PHP值,该值告诉查询要使用哪个学校ID。
这是我试图让所有学校进入名单的尝试。
$sumreviews = mysql_query("SELECT *,
ROUND(
((Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15+
Q16+Q17+Q18+Q19+Q20+Q21+Q22+Q23+Q24+Q25+Q26+Q27+Q28+Q29+Q30+
Q31+Q32+Q33+Q34+Q35+Q36+Q37+Q38+Q39+Q40+Q41+Q42+Q43+Q44+Q45+
Q46+Q47+Q48+Q49+Q50+Q51+Q52)/(52*10)
*10),2) AS atotal
FROM reviews
RIGHT JOIN schools ON schools.SID = reviews.schoolID
GROUP BY schools.schoolName, reviews.schoolID
ORDER BY atotal DESC")or die(mysql_error());
这个查询给了我学校的列表,但是“atotal”的输出只给了我给定学校的第一行的总和(在这种情况下是7.31 - 并且可以在输出的下方看到,但平均得分应为7.23)。
如果我在上面的查询中删除GROUP BY,我会得到所有学校的列表,以及一些有更多评论的学校的额外行 - 比如American School of Dubai。
学校名称,城市,国家,评级
迪拜美国学校,迪拜,U.A.E。 7.31
迪拜美国学院,迪拜,U.A.E。 7.19
迪拜美国学校,迪拜,U.A.E。 7.15
泰国Bankok曼谷国际学校 巴西里约热内卢美国学校
布达佩斯美国学校,匈牙利布达佩斯
苏黎世国际学校,瑞士苏黎世
我想知道,如何构建查询以便对所有给定学校的“AS atotal”行进行分组和平均?如果我将7.31与7.15作为迪拜美国学校的个人评论分数进行平均,我会得到正确的7.23。答案就在那里,但我似乎无法将它们连接在一起。
我提前道歉,因为我缺乏“造型”的问题!
答案 0 :(得分:1)
你有没有试过像
这样的东西 SELECT schools.schoolName,
ROUND(AVG(
((Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15+
Q16+Q17+Q18+Q19+Q20+Q21+Q22+Q23+Q24+Q25+Q26+Q27+Q28+Q29+Q30+
Q31+Q32+Q33+Q34+Q35+Q36+Q37+Q38+Q39+Q40+Q41+Q42+Q43+Q44+Q45+
Q46+Q47+Q48+Q49+Q50+Q51+Q52)/(52*10)
*10)),2) AS average
FROM reviews
RIGHT JOIN schools ON (schools.SID = reviews.schoolID)
GROUP BY schools.SID
ORDER BY average DESC;
您的上一个查询没有任何聚合函数,因此可能是它没有返回预期结果的原因。
尚未测试查询,但如果您提供了SQLFiddle或示例测试数据,我可以验证。
答案 1 :(得分:1)
我没有测试查询,但我认为最好先写一个:
SELECT ROUND(AVG((Q1+Q2+Q3+Q4+Q5+Q6+Q7+Q8+Q9+Q10+Q11+Q12+Q13+Q14+Q15+
Q16+Q17+Q18+Q19+Q20+Q21+Q22+Q23+Q24+Q25+Q26+Q27+Q28+Q29+Q30+
Q31+Q32+Q33+Q34+Q35+Q36+Q37+Q38+Q39+Q40+Q41+Q42+Q43+Q44+Q45+
Q46+Q47+Q48+Q49+Q50+Q51+Q52)/52),2) AS total
FROM reviews
WHERE schoolID='$schoolvalue'
更容易编写和阅读。
对于第二个查询,问题是SELEC子句上没有聚合函数AVG。看看Iserni的回答,我认为这是正确的。