「イベント」と「部屋」の2つのテーブルがあります。
部屋のテーブルは次のようになります。
CREATE TABLE `rooms` (
`roomKey` INT(9) UNSIGNED NOT NULL AUTO_INCREMENT,
`locationID` INT(9) NOT NULL DEFAULT '0',
`locationName` VARCHAR(150) NOT NULL DEFAULT '',
`buildingID` INT(9) NOT NULL DEFAULT '0',
`buildingName` VARCHAR(150) NOT NULL DEFAULT '',
`areaID` INT(9) NOT NULL DEFAULT '0',
`areaName` VARCHAR(150) NOT NULL DEFAULT '',
`roomID` INT(9) NOT NULL DEFAULT '0',
`roomName` VARCHAR(150) NOT NULL DEFAULT '',
`clientKey` MEDIUMINT(5) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`roomKey`),
UNIQUE INDEX `locationID` (`locationID`, `buildingID`, `areaID`, `roomID`, `clientKey`),
INDEX `clientKey` (`clientKey`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=21270411;
イベント テーブルは次のようになります。
CREATE TABLE `events` (
`eventKey` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
`accountNum` INT(11) NULL DEFAULT NULL,
`locationID` INT(9) NOT NULL DEFAULT '0',
`buildingID` INT(9) NOT NULL DEFAULT '0',
`areaID` INT(9) NOT NULL DEFAULT '0',
`roomID` INT(9) NOT NULL DEFAULT '0',
`clientKey` SMALLINT(5) UNSIGNED NOT NULL,
`roomKey` INT(10) UNSIGNED NOT NULL DEFAULT '0',
`eventTitle` VARCHAR(100) NOT NULL DEFAULT '',
`dateStart` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`dateEnd` DATETIME NOT NULL DEFAULT '0000-00-00 00:00:00',
`status` SMALLINT(5) UNSIGNED NOT NULL DEFAULT '0',
PRIMARY KEY (`eventKey`),
UNIQUE INDEX `uniqueEvent` (`accountNum`, `locationID`, `buildingID`, `areaID`, `roomID`),
INDEX `clientKey` (`clientKey`)
)
COLLATE='latin1_swedish_ci'
ENGINE=InnoDB
AUTO_INCREMENT=98690419;
新しいイベントの一括インポートをイベント テーブルに挿入するプロセスがあります。完了したら、「rooms」テーブルの主キーに対応する roomKey で新しいレコードを更新する必要があります。これは、rooms のレコードの locationID、buildingID、areaID、roomID、および clientKey を使用して一致させることができます。テーブル。(複数のアカウントが同じ場所、建物、エリア、または部屋の値を持つ可能性があるため、clientKey が必要です)。
現在、これに使用するクエリは次のとおりです。
UPDATE events e, rooms dr SET e.locationKey=dr.locationKey
WHERE e.locationID=dr.locationID
AND e.buildingID=dr.buildingID
AND e.areaID=dr.areaID
AND e.roomID=dr.roomID
AND e.clientKey=dr.clientKey
ただし、2 つのアカウント (クライアント) の場所、建物、面積、部屋の値が同じ場合は考慮されません。クエリは、別のアカウントが同じ locationID、BuildingID、areaID、および roomID を持つ部屋レコードを持っているという事実に基づいて、イベント レコードに間違った roomKey 値を配置する可能性があります。
以下に示すように実行するようにクエリを変更できますが、非常に遅いです。使用するのに適切なクエリではないことはわかっているので、PHP ループなどでこの更新を行うことなく、改善を検討しています。
UPDATE EVENTS e, rooms dr SET e.locationKey=dr.locationKey
WHERE (e.locationID=dr.locationID AND e.clientKey=dr.clientKey)
AND (e.buildingID=dr.buildingID AND e.clientKey=dr.clientKey)
AND (e.areaID=dr.areaID AND e.clientKey=dr.clientKey)
AND (e.roomID=dr.roomID AND e.clientKey=dr.clientKey)
AND e.clientKey=dr.clientKey