SQL Select outter Join and Group By и IFNULL (COUNT) HELP =x

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

База данных

Table -> Candidato | IdCandidato(int) | idNome(varchar)

Table -> Voto  | idVoto(int) | Candidato_idCandidato(int) | DiaVotacao(date)

Я создаю систему веб-голосования, и мне нужно выбрать, чтобы завершить графику, чтобы показать общее количество голосов за каждый день для каждого кандидата.

Candidato = candidate | voto = vote | diaVotacao = voting day (english translation)

Мне нужен такой ответ:

|VotingDay---------|-----Candidate1----------|-----Candidate2------|--Candidate3

|2014-05-14-------|---13(total votes)---------|------------4------------|-----------10|

|2014-05-15-------|---18(total votes)---------|------------0------------|------------8|

и пока я получил это:

|VotingDay---------|-----TOTAL Votes----------|-----Name------|

|2014-05-14-------|---13(total votes)---------|-Candidate1

|2014-05-14-------|---18(total votes)---------|-Candidate2

|2014-05-15-------|---10(total votes)---------|-Candidate1

|2014-05-15-------|----8(total votes)---------|-Candidate2

Я использовал следующий код:

SELECT voto.DiaVotacao, IFNULL(COUNT(voto.Candidato_idCandidato),0) as Votos, candidato.Nome FROM candidato LEFT OUTER JOIN voto ON voto.Candidato_idCandidato=candidato.idCandidato ГРУППА ПО voto.DiaVotacao, voto.Candidato_idCandidato

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


person Thaffareu    schedule 18.05.2014    source источник


Ответы (1)


Вам нужно создать полный список кандидатов и дней, а затем затем выполнить left outer join. Вы можете получить список дней из таблицы votos.

Обратите внимание, что когда вы используете count(<column>), он возвращает 0, если все значения равны NULL. Нет необходимости в ifull() или coalesce():

SELECT d.DiaVotacao, COUNT(v.Candidato_idCandidato) as Votos, c.Nome
FROM candidato c cross join
     (SELECT DISTINCT v.DiaVotacao FROM voto v
     ) d LEFT OUTER JOIN
     voto v
     ON v.Candidato_idCandidato = c.idCandidato and
        v.DiaVotacao = d.DiaVotacao
GROUP BY d.DiaVotacao, v.Candidato_idCandidato;
person Gordon Linoff    schedule 18.05.2014
comment
я так знаком со всеми этими параметрами, что вы проявляете большую мудрость, но когда вы ссылаетесь на v.diavotacao, я получаю сообщение об ошибке: Код ошибки: 1054 Неизвестный столбец «v.DiaVotacao» в «списке полей», который я пытался заменить на voto.diavotacao но я получил те же результаты, что и даты, которые не различаются, возможно, v-таблицу, полученную из разных, следует объявить до их упоминания? я делаю что-то не так? - person Thaffareu; 19.05.2014