2009-07-16 90 views
1

在我開始編碼之前,我想首先想出一個好的設計。基本上,我有一個充滿日期的數據庫表,以及與這些日期相關聯的用戶(日期是sql格式)。用於平日/週末計數的MySQL/PHP算法(每月)

使用PHP我想爲每個用戶計算(總共計算)他們有多少個工作日以及它們與多少個週末相關聯。我需要每個月的總數以及總數。這需要從八月到五月「運行」。

我知道,我能確定一天是否是週末或平日:

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

爲了確定一個月,我可以使用SQL,並使用一個case語句,例如,讓「十月「from」10「:

SELECT MONTH(DATE_SPECIFIED); 

但是,我最不確定的是什麼過程。我可以很容易地有很多查詢,但效率很低。理想情況下,我正在考慮在html表格中打印結果。

任何人都可以提供任何建議/建議你可能會怎麼做?

謝謝。


編輯:

我有一個用戶表,並且eventcal表。

下面是用戶表:

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 

這裏是eventcal表:

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 ...

+1

你可以把數據庫架構嗎?我的答案在下面假設你有一個用戶表,一個日期表和它們之間的鏈接...... – benlumley 2009-07-16 22:32:32

+1

雖然它也可以工作,如果你只有一個用戶和一個user_date表 – benlumley 2009-07-16 22:33:06

回答

2

你應該能夠做到....(假設你有一個日期表,用戶表,和一個鏈接表)

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' 

您還可以使用同組通過後彙總關鍵字有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行,一個平日,一個週末。

(雖然我不完全以確保您可以通過這樣的計算值組,我認爲你可以 - 讓我知道如果你試試!)

2

MySQL有一個WEEKDAY()函數:

WEEKDAY(日期)

返回日期的工作日索引(0 =星期一,1 =星期二,... 6 =星期日)。

你應該可以在GROUP BY月的MySQL查詢中使用它。

我的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