Подсчет вхождений в будние дни, когда несколько дней пусты mysql

#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 снова, так что это не то, что я ищу. В любом случае спасибо