2012-11-16 57 views
5

我想出了一个死胡同,而试图实现一个简单的日历。 这是我的周表模式:实现一个简单的日历

DROP TABLE IF EXISTS `weeks`; 
CREATE TABLE `weeks` (
    `weeknum` varchar(255) NOT NULL DEFAULT '', 
    `period1` varchar(255) DEFAULT NULL, 
    `period2` varchar(255) DEFAULT NULL, 
    `A11` varchar(255) DEFAULT NULL, 
    `A22` varchar(255) DEFAULT NULL, 
    `A31` varchar(255) DEFAULT NULL, 
    `A32` varchar(255) DEFAULT NULL, 
    `C11` varchar(255) DEFAULT NULL, 
    `C12` varchar(255) DEFAULT NULL, 
    `C21` varchar(255) DEFAULT NULL, 
    `C22` varchar(255) DEFAULT NULL, 
    `C31` varchar(255) DEFAULT NULL, 
    `C32` varchar(255) DEFAULT NULL, 
    `D11` varchar(255) DEFAULT NULL, 
    `D12` varchar(255) DEFAULT NULL, 
    `D21` varchar(255) DEFAULT NULL, 
    `D22` varchar(255) DEFAULT NULL, 
    `D31` varchar(255) DEFAULT NULL, 
    `D32` varchar(255) DEFAULT NULL, 
    `E11` varchar(255) DEFAULT NULL, 
    `E12` varchar(255) DEFAULT NULL, 
    `E21` varchar(255) DEFAULT NULL, 
    `E22` varchar(255) DEFAULT NULL, 
    `E31` varchar(255) DEFAULT NULL, 
    `E32` varchar(255) DEFAULT NULL, 
    PRIMARY KEY (`weeknum`) 
) ENGINE=InnoDB DEFAULT CHARSET=greek; 

列名是房间号码和运行包含WEEKNUM查询(例如40)作为参数后的weeknum取值从15到45 ,我得到一些房间号码(E31,E32等)。 我只是想设置单元格值“是”适当的行和列,根据查询的结果。 例如:运行

select room.roomnum 
from payment,contract,room,customer 
where payment.contractID = contract.contractID 
and contract.roomID=room.roomID 
and customer.customerID=payment.customerID 
and payment.yearkoino='2009' and contract.weeknum=40 

后,我得到:

+---------+ 
| roomnum | 
+---------+ 
| c21 | 
| a32 | 
| c12 | 
| d12 | 
| d11 | 
| e22 | 
| a22 | 
| c31 | 
| e12 | 
+---------+ 

这也是有可能给你什么,我试图做一个想法截图:

http://img37.imageshack.us/img37/7633/screenshotoy.png

任何帮助,将不胜感激。

+2

大家好,欢迎SO!请注意将来格式化您的帖子。我这次为你做了这件事 - 通过点击我名字上方的小编辑“X分钟前”来了解我所做的和你最初发布的内容之间的差异,以了解我所做的事情。 =) –

+0

btw你可能会喜欢[日期格式](http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-format) –

+1

也我不建议你将房间号码设置为collumns –

回答

1

一般来说它能够更好地使用第三范式对于这些类型的任务。对于周

一个表,一个用于室,然后是第三表跟踪的关系RoomWeek。

RoomWeek将至少有两个领域 - RoomNum,Room.RoomNum WEEKNUM的孩子,Week.WekNum 状态的孩子,跟踪 “是/否” 等 等领域需要

下一个步骤是通过房间和周表的交叉连接填充RoomWeek,以获得每行可能性的一行。

所以那么当你有一个返回房间列表某一周的查询,那么你会做这样的事情

update RoomWeek, payment,contract,room,customer 
set RoomWeek.status = "Yes" 
where payment.contractID = contract.contractID 
and contract.roomID=room.roomID 
and customer.customerID=payment.customerID 
and payment.yearkoino='2009' and contract.weeknum=40 
and RoomWeek.weeknum = contract.weeknum 
and RoomWeek.Roomnum = room.roomnum 

如果你坚持更新当前表那么它的棘手BC它要困难得多更新像周表时要更新,然后列依赖于数据本身(roomnum返回) - 这是可以做到的,但如果房间的变化,你的表有改变,代码可能需要改变等等。