2010-05-19 61 views
1

這裏所說:在同一個查詢中獲取用戶羣投票的平均數和個人用戶的投票數?

T1 
[id] [desc] 
1 lovely 
2 ugly 
3 slender 

T2 
[id] [userid] [vote] 
1  1  3 
1  2  5 
1  3  2 
2  1  1 
2  2  4 
2  3  4 

在一個查詢(如果可能的話),我想回:

T1.id, T1.desc, AVG(T2.vote), T2.vote (for user viewing the page) 

我能得到前3項有:

SELECT T1.id, T1.desc, AVG(T2.vote) 
FROM T1 
LEFT JOIN T2 ON T1.id=T2.id 
GROUP BY T1.id 

和我可以得到第一,第二和第四項:

SELECT T1.id, T1.desc, T2.vote 
FROM T1 
LEFT JOIN T2 ON T1.id=T2.id 
WHERE T2.userid='1' 
GROUP BY T1.id 

但我不知道如何獲得一個查詢中的所有四個項目。我試圖插入一個選擇作爲第四項:

SELECT T1.id 
    , T1.desc 
    , AVG(T2.vote) 
    , (SELECT T2.vote 
      FROM T2 
     WHERE T2.userid='1') AS userVote 
    etc 
    etc 

,但我得到一個錯誤的select returns more than one row...

幫助?

我希望在一個查詢而不是兩個查詢中做到這一點的原因是,我希望能夠對MySQL中的數據進行排序,而不是將其分割爲多個數組。

回答

1

讓你的子查詢與整個查詢相關。我認爲這是你想要的東西:

SELECT t1.id, t1.descr, AVG(t2.vote), 
    (SELECT t2.vote FROM t2 WHERE t2.userid = 1 AND t1.id = t2.id) AS uservote 
FROM t1 
LEFT JOIN t2 USING (id) 
GROUP BY t1.id 

結果我得到的是:

+------+---------+--------------+----------+ 
| id | descr | AVG(t2.vote) | uservote | 
+------+---------+--------------+----------+ 
| 1 | lovely |  3.3333 |  3 | 
| 2 | ugly |  3.0000 |  1 | 
| 3 | slender |   NULL |  NULL | 
+------+---------+--------------+----------+ 
3 rows in set (0.00 sec) 
+0

它有!謝謝大衛。我想我是在(SELECT)的正確軌道上,但沒有完成它的訣竅。我從來沒有見過LEFT JOIN .. USING()之前,我需要閱讀USING對此查詢有何影響。 **非常感謝你!!! ** – Drew 2010-05-19 05:58:08

0

我覺得這是它:

SELECT T1.id, T1.desc, T3.avgVote, T2.vote 
FROM T1 
    LEFT OUTER JOIN 
    (SELECT id, AVG(vote) AS avgVote FROM T2) 
    AS T3 ON T1.id=T3.id 
    LEFT OUTER JOIN 
    T2 ON T1.id=T2.id AND T2.userid=<UserID> 
+0

這似乎是在正確的軌道上,但我只獲得了第一個項目的AVG值。所有後續項目都是NULL。 – Drew 2010-05-19 05:46:50