Группировка данных по годам - ​​возврат 0 без результатов - PullRequest
1 голос
/ 15 мая 2009

Мой текущий запрос MySQL:

SELECT MAX( s.con_grade ) AS max, YEAR( u.sent_date ) AS year
FROM pdb_usersectionmap u
LEFT JOIN pdb_sections s ON u.section_id = s.id
WHERE u.user_id =21
AND YEAR( u.sent_date ) > '2004-01-01'
GROUP BY YEAR( u.sent_date )
ORDER BY u.sent_date ASC

(год и идентификатор пользователя генерируются динамически в PHP)

Я пытаюсь отобразить результаты за последние 5 лет. В некоторых случаях у пользователя может не быть МАКСА на этот год. Например, этот пользователь имеет записи только за последние 3 года (но не ранее):

max     year
5     2007
6.05    2008
7     2009

Мой вопрос: Если я скажу MySQL искать записи в определенные годы, есть ли способ для MySQL вернуть «0» за год, если не найдено ни одной записи?

В идеале, я бы хотел, чтобы результат был (сэкономил бы мне много времени):

year    max
2005      0
2006       0
2007      5
2008       6.05
2009       7

Ответы [ 3 ]

1 голос
/ 15 мая 2009

Один правильный способ сделать это - иметь таблицу лет, выполнить внешнее соединение с ней и сгруппировать по столбцу года в этой таблице, что-то вроде этого (не проверено)

SELECT MAX( s.con_grade ) AS max, YEAR( u.sent_date ) AS year
FROM pdb_usersectionmap u
LEFT JOIN pdb_sections s ON u.section_id = s.id
RIGHT JOIN years y ON year = y.year_id
WHERE u.user_id =21
AND y.year_id > 2004
GROUP BY y.year_id
ORDER BY u.sent_date ASC

Таблица лет, конечно, может быть сгенерирована на лету или с помощью «отдельного» подзапроса к другой таблице.

0 голосов
/ 15 мая 2009

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

UNION SELECT '0', '2006'
UNION SELECT '0', '2007'
etc..

Я бы все же попытался перенести эту логику в ваше PHP-приложение.

0 голосов
/ 15 мая 2009
isnull(<field>, <value>)

Позвольте привести пример.

SELECT ISNULL(MAX(s.con_grade),0) AS [max]
      ,YEAR( u.sent_date ) AS [year]
  FROM pdb_usersectionmap u,
      ,pdb_sections s
 WHERE u.section_id = s.id
   AND u.user_id = 21
   AND YEAR(u.sent_date) > '2004-01-01'
 ORDER
    BY u.sent_date

Я сделал это присоединение неявным из-за лени.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...