在尝试实现一个简单的日历时,我已经走到了尽头.那是我周的表格架构:
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;
Run Code Online (Sandbox Code Playgroud)
列名是房间号,在运行包含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
Run Code Online (Sandbox Code Playgroud)
我明白了:
+---------+
| roomnum |
+---------+
| c21 |
| a32 |
| c12 |
| d12 |
| d11 |
| e22 |
| a22 |
| c31 |
| e12 |
+---------+
Run Code Online (Sandbox Code Playgroud)
这也是一个截图,可能会让你知道我想要做什么:
http://img37.imageshack.us/img37/7633/screenshotoy.png
任何帮助,将不胜感激.
一般来说,对于这些类型的任务,最好使用第三范式。
一张表代表周,一张表代表房间,然后第三张表跟踪关系 RoomWeek。
RoomWeek 至少有两个字段 - RoomNum、Room.RoomNum WeekNum 的子项、Week.WekNum Status 的子项、跟踪“是/否”等。根据需要提供其他字段
下一步是使用 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
Run Code Online (Sandbox Code Playgroud)
如果您坚持更新当前表,那么它会很棘手,因为更新像 Week 这样的表要困难得多,因为您想要更新的列取决于数据本身(返回的 roomnum) - 这是可以做到的,但如果房间改变,你的桌子必须改变,代码可能需要改变等等。