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

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

이 올바른 궤도에있을 것 같다,하지만 난 첫 번째 항목에 대한 평균 값을 얻고있다. 이후의 모든 항목은 NULL입니다. – Drew

관련 문제