Прежде чем начать кодирование, я хочу сначала создать хороший дизайн. В принципе, у меня есть таблица базы данных, заполненная датами, и пользователи, связанные с этими датами (даты указаны в формате 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