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

一般的に言えば、これらのタイプのタスクには第 3 正規形を使用する方が適切です。

Weeks 用に 1 つのテーブル、Rooms 用に 1 つ、そして RoomWeek のリレーションを追跡する 3 つ目のテーブル。

RoomWeek には少なくとも 2 つのフィールドがあります - RoomNum、Room.RoomNum の子 WeekNum、Week.WekNum Status の子、「はい/いいえ」の追跡など、必要に応じて他のフィールド

次のステップは、Room テーブルと Week テーブルからクロス結合を使用して RoomWeek を設定し、すべての可能性に対して 1 つの行を取得することです。

したがって、特定の週の部屋リストを返すクエリがある場合は、次のようにします

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が返される)、Weekのようなテーブルを更新するのがはるかに困難です-これは可能ですが、部屋の変更、テーブルの変更、コードの変更などが必要になる場合があります。

于 2012-11-17T16:22:00.180 に答える