получить среднее количество голосов пользователей и отдельных пользователей в одном запросе? - PullRequest
1 голос
/ 19 мая 2010

Вот так:

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 вместо того, чтобы разбивать их на несколько массивов.

Ответы [ 2 ]

1 голос
/ 19 мая 2010

Сделайте ваш подзапрос коррелированным с общим запросом. Я думаю, это то, что вы хотели:

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 голосов
/ 19 мая 2010

Я думаю, что это так:

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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...