0

我正在使用 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。答案就在那里,但我似乎无法将它连接在一起。

对于我缺乏“造型”问题,我提前道歉!

4

2 回答 2

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 或我可以验证的示例测试数据。

于 2012-10-31T17:53:07.293 回答
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的答案,我认为它是正确的。

于 2012-10-31T18:07:36.967 回答