Алгоритм MySQL / PHP для расчета количества дней недели / недели (в месяц)

Прежде чем начать кодирование, я хочу сначала создать хороший дизайн. В принципе, у меня есть таблица базы данных, заполненная датами, и пользователи, связанные с этими датами (даты указаны в формате sql).

Используя PHP, я хочу, чтобы каждый пользователь вычислил (общее количество), сколько дней, с которыми они связаны, и сколько уикэндов, с которыми они связаны. Мне нужно иметь общее количество за каждый месяц, а также общую сумму. Это необходимо для «запуска» с августа по май.

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

$date = '2007/08/30'; $weekday = date('l', strtotime($date)); 

Для определения месяца я могу использовать SQL и использовать case case, например, для получения «Октября» от «10»:

  SELECT MONTH(DATE_SPECIFIED); 

Однако я не уверен в том, какой процесс пройти. Я мог бы легко получить несколько запросов, но это неэффективно. В идеале я думал о печати результатов в таблице html.

Может ли кто-нибудь предложить какие-либо предложения / советы о том, как вы можете это сделать?

Благодарю.


РЕДАКТИРОВАТЬ:

У меня есть таблица пользователей и таблица событий.

Вот таблица пользователей:

  CREATE TABLE `users` ( `fname` varchar(50) NOT NULL, `lname` varchar(50) NOT NULL, `role` varchar(75) NOT NULL, `region` tinyint(4) unsigned default NULL, `username` varchar(25) NOT NULL, `password` varchar(75) NOT NULL, `new_pass` varchar(5) default NULL, PRIMARY KEY (`username`), KEY `role` (`role`), KEY `region` (`region`), CONSTRAINT `users_ibfk_2` FOREIGN KEY (`region`) REFERENCES `region` (`region`) ON UPDATE CASCADE, CONSTRAINT `users_ibfk_1` FOREIGN KEY (`role`) REFERENCES `role` (`role`) ON UPDATE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 

И вот таблица событий:

  CREATE TABLE `eventcal` ( `id` int(11) NOT NULL auto_increment, `region` tinyint(3) unsigned NOT NULL, `primary` varchar(25) NOT NULL, `secondary` tinyint(1) NOT NULL, `eventDate` date NOT NULL, PRIMARY KEY (`id`), KEY `primary_2` (`primary`), CONSTRAINT `eventcal_ibfk_1` FOREIGN KEY (`primary`) REFERENCES `users` (`username`) ON DELETE CASCADE ON UPDATE CASCADE ) ENGINE=InnoDB AUTO_INCREMENT=28 DEFAULT CHARSET=utf8 

Обратите внимание, что evencal.primary имеет ссылку на внешний ключ для users.username …

Вы должны уметь делать …. (Предполагая, что у вас есть таблица дат, таблица пользователя и таблица ссылок)

 SELECT MONTH(eventDate), DAYOFWEEK(eventDate), COUNT(*) FROM eventcal as e LEFT JOIN users as u ON e.primary = u.username GROUP BY MONTH(eventDate), DAYOFWEEK(eventDate); 

Это должно возвращать нагрузку строк, 3 столбца каждая до 7 строк в месяц. Один из них – индекс дня (1 = воскресенье, 7 = суббота), один – числовой месяц, а один – число пользователей, прикрепленных к этому дню.

Если вам нужно ограничить определенные месяцы, вы можете добавить предложение where так же, как …

 WHERE eventDate BETWEEN '20090501' AND '20091001' 

Вы также можете использовать ключевое слово WITH ROLLUPS после группы, чтобы mysql возвращал итоговые данные в день недели или в месяц. Но это часто становится более сложной задачей, чем экономит вас, поскольку вам приходится писать логику, чтобы определить, является ли текущая строка общей или нет.

РЕДАКТИРОВАТЬ:

Если вы хотите получить выходные / будничные значения напрямую:

 SELECT MONTH(eventDate), IF(WEEKDAY(eventDate)<5, 'weekday', 'weekend') AS DAY, COUNT(*) FROM eventcal as e LEFT JOIN users as u ON e.primary = u.username GROUP BY MONTH(eventDate), IF(WEEKDAY(eventDate)<5, 'weekday', 'weekend'); 

Это вернется, как указано выше, но только 2 строки в месяц, по будням, по выходным.

(Хотя я не уверен, что вы можете группироваться по расчетному значению, как это, я думаю, вы можете – дайте мне знать, если вы попробуете!)

У MySQL есть функция WEEKDAY ():

WEEKDAY (дата)

Возвращает индекс недели недели (0 = понедельник, 1 = вторник, … 6 = воскресенье).

Вы должны использовать это в запросе MySQL с месяцем GROUP BY.

Мои знания SQL очень ржавые, и я уверен, что это недопустимый SQL, но вы должны получить от него суть.

 SELECT user, weekdaysPerMonth, month FROM (SELECT COUNT(*) AS weekdaysPerMonth, user, date, month FROM table WHERE WEEKDAY(date) > 0 AND WEEKDAY(date) < 5) GROUP BY month