将返回多个平均值的SQL查询

时间:2014-01-15 13:53:26

标签: php mysql sql

我正在尝试编写一个返回平均值数组的mysql查询。 我会解释一下:

My rating table

从图中可以看出,我有一个网页,其中包含一个表格,其中包含问题为行,用户名为列。我们的想法是,您可以针对每个问题对每个用户进行评分。 提交时,它进入mysql表“评级”,每条记录包含用户ID,问题ID和值(1到10的评级)。 我想要做的是,我希望有一个管理员视图,而不是每个选择框,而不是每个选择框,它应该只为每个问题显示每个用户的平均值。

我可以在php中完成它,只需对此表中的每个单元格执行mysql查询,但这意味着需要进行大量查询。 我想要的是一个查询将返回一个二维数组,其中第一个维度键是用户ID,第二个维度是具有平均值的数组本身,键作为问题ID。

我甚至无法开始思考如何实现它。一个解决方案,或者甚至是对哪个方向的暗示,都将非常受欢迎!

CREATE TABLE IF NOT EXISTS `ratings` (
  `rating_id` int(255) NOT NULL AUTO_INCREMENT,
  `user_id` int(6) NOT NULL,
  `question_id` int(6) NOT NULL,
  `rating_value` int(2) NOT NULL,
  PRIMARY KEY (`rating_id`),
  KEY `user_id` (`user_id`,`question_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=13 ;

2 个答案:

答案 0 :(得分:1)

您无法直接从MySQL创建二维数组 - 但是,您可以在php中准备数据。

查询看起来有点像:

SELECT
  user_id,
  question_id,
  AVG(rating_value) AS average_rating
FROM ratings
GROUP BY user_id, question_id
ORDER BY user_id

像这样你应该得到如下结果:

user_id | question_id | average_rating
1       | 1           | 2.4
1       | 2           | 4.1
1       | 3           | 3.0
2       | 1           | 1.0
2       | 2           | 7.9

等等。从这里开始,我想你可以用php解决问题。

答案 1 :(得分:0)

你需要为每个问题创建关系,然后加入每个关系,最后做一个GROUP BY,如下所示:

SELECT q1.userid, avg(q1.value) as q1avg, avg(q2.value) as q2avg, 
       avg(q3.value) as q3avg, avg(q4.value) as q4avg 
FROM
(SELECT userid, questionid, value FROM ratings WHERE questionid=1) q1
JOIN
(SELECT userid, questionid, value FROM ratings WHERE questionid=2) q2
ON q1.userid = q2.userid
JOIN
(SELECT userid, questionid, value FROM ratings WHERE questionid=3) q3
ON q1.userid = q3.userid
JOIN
(SELECT userid, questionid, value FROM ratings WHERE questionid=4) q4
ON q1.userid = q4.userid
GROUP BY q1.userid

工作演示:http://sqlfiddle.com/#!2/fbc8a/2

它会以2D格式显示结果。