我正在使用 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());
这会生成所有列和行的正确总和和平均值,四舍五入到小数点后两位。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());
这个查询给了我学校的列表,但是“总”的输出只给了我那个给定学校的第一行的总和(在这种情况下是 7.31 - 可以在输出的下方看到,但平均分数应为 7.23)。
如果我在上面的查询中删除 GROUP BY,我会得到所有学校的列表,以及一些有更多评论的学校的额外行——比如迪拜美国学校。
学校名称、城市、国家、评级
美国迪拜学校,迪拜,阿联酋 7.31
迪拜美国学院,迪拜,阿联酋 7.19 迪拜
美国学校,迪拜,阿联酋 7.15
曼谷国际学校,泰国班克克,
里约热内卢美国学校, 巴西
布达佩斯美国学校, 匈牙利布达佩斯
苏黎世国际学校, 苏黎世, 瑞士
我想知道,如何构造查询,以便对所有给定学校的“AS 总计”行进行分组和平均?如果我将 7.31 与 7.15 列为迪拜美国学校的个人评论分数进行平均,我会得到正确的 7.23。答案就在那里,但我似乎无法将它连接在一起。
对于我缺乏“造型”问题,我提前道歉!