2010-05-19 59 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