2015-11-26 2 views
1

У меня есть 3 таблицы:присоединиться графом на присоединяемую таблицу с пунктом группы в MySQL

приложение
  • (имеет много голосов)
  • голосов (принадлежит к приложениям и вопросам)
  • вопросов (имеет много голосов)

Мне нужно получить количество голосов за заявку на вопрос.

Итак, моя попытка была:

SELECT applications.id, COUNT(votes.id), votes.question_id 
FROM applications 
LEFT OUTER JOIN votes ON (votes.application_id = application.id) 
GROUP BY votes.question_id 

Однако, он отображает данные только для одного приложения, поэтому я предполагаю, что мой запрос неверен:

+----+-----------------+-------------+ 
| id | COUNT(votes.id) | question_id | 
+----+-----------------+-------------+ 
| 1 |   1185 |   1 | 
| 1 |   1170 |   2 | 
| 1 |   1209 |   3 | 
| 1 |   1230 |   4 | 
| 1 |   1213 |   5 | 
+----+-----------------+-------------+ 

Что мне нужно:

+----+-----------------+-------------+ 
| id | COUNT(votes.id) | question_id | 
+----+-----------------+-------------+ 
| 1 |   1185 |   1 | 
| 1 |   1170 |   2 | 
| 1 |   1209 |   3 | 
| 1 |   1230 |   4 | 
| 1 |   1213 |   5 | 
| 2 |   null |   1 | 
| 2 |   50 |   2 | 
| 2 |   333 |   3 | 
| 2 |   1230 |   4 | 
| 2 |   1213 |   5 | 
| 3 |   null |   1 | 
| 3 |   50 |   2 | 
| 3 |   333 |   3 | 
| 3 |   null |   4 | 
| 3 |   5555 |   5 | 
+----+-----------------+-------------+ 

ответ

2

Пункт group by отсутствует applications.id.

SELECT applications.id, COUNT(votes.id), votes.question_id 
FROM applications 
LEFT OUTER JOIN votes ON votes.application_id = application.id 
group by applications.id, votes.question_id 
1

Вы должны группировать по applications.id, а также questions.id:

SELECT a.id, COUNT(votes.id), votes.question_id 
FROM applications a LEFT OUTER JOIN 
    votes v 
    ON v.application_id = a.id 
GROUP BY a.id, v.question_id; 

Однако, это не будет производить именно то, что вы хотите. Кажется, вам нужны все вопросы для приложений, независимо от того, есть или нет какие-либо голоса. Если это так, это, вероятно, то, что вы хотите:

SELECT a.id, q.question_id, COUNT(v.application_id) 
FROM applications a CROSS JOIN 
    (SELECT DISTINCT question_id FROM votes) q LEFT JOIN 
    votes v 
    ON v.application_id = a.id and v.question_id = q.question_id 
GROPU BY a.id, q.question_id; 
Смежные вопросы