1

「イベント」と「部屋」の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
4

2 に答える 2

0

clientKey値が正式なものであり、一致する値に基づいてすべての値roomsを更新したいだけの場合は、次のようにすることができます。clientKeyeventsroomID

UPDATE rooms AS r
INNER JOIN events AS e ON r.roomKey = e.roomKey
SET e.clientKey = r.clientKey
于 2012-09-10T17:24:11.623 に答える
0

Mysqlでは、参加するときにこの構文を使用できますupdate

UPDATE table1 t1 
       INNER JOIN table2 t2 
         ON t1.id = t2.id
SET t1.col1 = t2.col2, t1.col2 = t2.col2
于 2012-09-10T16:11:20.310 に答える