2014-01-15 74 views
0

我正在嘗試編寫一個將返回平均值數組的mysql查詢。 我會解釋:將返回多個平均值的SQL查詢

My rating table

正如你從圖片上可以看到,我有一個網頁,有問題的行,戶名作爲列的表。這個想法是,你可以在每個問題上評價每個用戶。 提交時,它進入一個MySQL表「評級」,每個記錄包含用戶ID,問題ID和值(評分1到10)。 我想要做的是,我想要有一個管理員視圖,而不是能夠評價用戶,而不是每個選擇框,它應該只顯示每個用戶對每個問題的平均值。

我可以通過在這個表中對每個單元格執行一次mysql查詢來完成它,但這意味着一個巨大的查詢。 我想要的是一個查詢,它會返回一個2維數組,其中第一個維度關鍵字是用戶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 ; 
+0

我們可以有代碼嗎? –

+0

你可以發表你的餐桌結構嗎? –

+0

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的默認字符集= LATIN1 AUTO_INCREMENT = 13; –

回答

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解決問題。

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格式。