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 取值从 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

任何帮助,将不胜感激。

4

1 回答 1

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

如果您坚持更新当前表,那么它很棘手,因为当您想要更新的列取决于数据本身(返回的 roomnum)时,更新像 Week 这样的表要困难得多 - 这是可以做到的,但如果房间改变,你的桌子必须改变,代码可能需要改变等。

于 2012-11-17T16:22:00.180 回答