表は次のとおりです。
CREATE TABLE `ToursCartsItems` (
`Id` int(10) unsigned NOT NULL auto_increment,
`UserId` char(40) default NULL,
`TourId` int(10) unsigned NOT NULL,
`CreatedAt` int(10) unsigned default NULL,
PRIMARY KEY (`Id`),
UNIQUE KEY `UniqueUserProduct` (`UserId`,`TourId`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 ROW_FORMAT=FIXED
// simple sample data
INSERT INTO
ToursCartsItems (UserId, TourId)
VALUES
("old", 1), ("old", 2), ("new", 1), ("new", 3);
したがって、1人のユーザーが多くのツアーを所有できます(ツアーが何であるかは気にしないでください)。UserIdフィールドは、char
ではなく、int
です。これは、ユーザーがログインしていない可能性があるためです。この場合、セッションIDが使用されます。
ユーザーがログインすると、ユーザーIDが変更されます。したがって、単純な更新は次のようになります。
UPDATE ToursCartsItems SET UserId="new" WHERE UserId="old"
-- In reality, the new UserId would be an integer, but never mind that.
ただし、これにより重複エントリキーが生成される可能性があります。古いユーザーと新しいユーザーの両方が同じツアーを持っている場合は、更新する前に1つだけドロップする必要があります。
だから私は試しました
UPDATE ToursCartsItems
SET UserId="in"
WHERE UserId="out"
AND (TourId NOT IN (SELECT TourId FROM ToursCartsItems WHERE UserId="in")
);
DELETE FROM ToursCartsItems WHERE UserId="old";
と
TRUNCATE ToursCartsItems;
INSERT INTO ToursCartsItems (UserId, TourId) VALUES ("old", 1), ("old", 2), ("new", 1), ("new", 3);
DELETE FROM ToursCartsItems WHERE UserId="old" AND TourId IN (SELECT TourId FROM ToursCartsItems WHERE UserId="new");
UPDATE ToursCartsItems SET UserId="new" WHERE UserId="old";
どちらも私にエラーを与えます。SQLクエリ自体でこれを行う方法はありますか、それとも私はただやらなければなりませんか?
SELECT * FROM ToursCartsItems WHERE UserId IN ("old", "new")
そして、PHPで必要な計算を自分で行いますか?