Mysql 实现一个简单的日历

Mysql 实现一个简单的日历,mysql,calendar,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, `A

我在尝试实现一个简单的日历时遇到了一个死胡同。 这是我的周表模式:

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等)。 我只想根据查询结果,将相应行和列的单元格值设置为“yes”。 例如:跑步后

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    |
+---------+
这也是一个屏幕截图,可以让您了解我正在尝试做什么:


任何帮助都将不胜感激。

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

一张表用于周,一张表用于房间,然后第三张表用于跟踪RoomWeek的关系

RoomWeek至少有两个字段- RoomNum,Room.RoomNum的子对象 WeekNum,一周之子。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

如果您坚持要更新当前表,那么更新像Week when then这样的表要困难得多,因为您要更新的列取决于数据本身(返回的roomnum)-这是可能的,但是如果房间更改,您的表必须更改,代码可能需要更改等等。

Hi,欢迎来到SO!请注意在将来格式化您的帖子。这一次我是为你做的——点击我名字上方的“编辑的X分钟前”来了解我所做的事情,看看我所做的事情与你第一次发布的内容之间的区别。=)顺便说一句,您可能也喜欢,我不建议您将房间号码设置为COLLMNS