实现一个简单的日历

时间:2012-11-16 19:58:03

标签: mysql calendar

在尝试实施简单的日历时,我已经走到了尽头。 那是我周的表格架构:

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的值是15到45。 在运行包含weeknum(例如40)作为参数的查询之后,我得到一些房间号码(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

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

一般来说,对于这些类型的任务,最好使用第三范式。

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

RoomWeek至少有两个字段 - RoomNum,Room.RoomNum的孩子 WeekNum,Week.WekNum的孩子 状态,跟踪“是/否”等 根据需要的其他领域

下一步是使用Room和Week表中的交叉连接填充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更难以更新像Week这样的表,那么你要更新的列依赖于数据本身(返回roomnum) - 这是可能的但是如果房间发生变化,你的桌子必须改变,代码可能需要改变等等。