#mysql #database
#mysql #База данных
Вопрос:
У меня есть таблица с некоторыми событиями и их датами в базе данных mysql, и я хочу вернуть подсчет событий за будний день следующим образом:
SELECT DAYNAME(start_date) AS day, count(DAYNAME(start_date)) as number FROM events GROUP BY day
Это отлично работает для дней, в которые происходят некоторые события, но не показывает пустые дни. Я знаю, что если бы у меня была простая таблица с днями недели, я мог бы выполнить простое ЛЕВОЕ СОЕДИНЕНИЕ и показать ВСЕ дни с count = 0, когда день пуст. Но есть ли какой-нибудь более простой способ сделать это без создания этой таблицы? Есть еще идеи?
Заранее спасибо
Ответ №1:
Одним словом «нет». Причина в том, что вы пытаетесь выбрать данные, которые не существуют!
Однако, поскольку в неделе всего 7 дней, вы можете создать свою простую таблицу «Дни недели» на лету:
select dayname('2011-10-31') union
select dayname('2011-11-01') union
select dayname('2011-11-02') union
select dayname('2011-11-03') union
select dayname('2011-11-04') union
select dayname('2011-11-05') union
select dayname('2011-11-06');
А затем LEFT OUTER JOIN
из этого в таблицу событий (как вы описали). Это позволит вам выполнить запрос без необходимости создавать и заполнять простую таблицу.
Хотя ради повторного использования и аккуратности я бы создал и заполнил простую таблицу днями недели и использовал ее.
Ответ №2:
SELECT
COALESCE(DAYNAME(start_date),'empty') AS day
, count(start_date) as number
FROM events
RIGHT JOIN (SELECT 0 as dy FROM DUAL UNION ALL
SELECT 1 as dy FROM DUAL UNION ALL
SELECT 2 as dy FROM DUAL UNION ALL
SELECT 3 as dy FROM DUAL UNION ALL
SELECT 4 as dy FROM DUAL UNION ALL
SELECT 5 as dy FROM DUAL UNION ALL
SELECT 6 as dy FROM DUAL UNION ALL
SELECT 'empty' as dy FROM DUAL) ds
ON (ds.dy = COALESCE(DAYNAME(start_date),'empty'))
GROUP BY ds.dy
Комментарии:
1. Это не возвращает дни со счетом 0 снова, так что это не то, что я ищу. В любом случае спасибо