0

表は次のとおりです。

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で必要な計算を自分で行いますか?

4

2 に答える 2

0

私は間違っているかもしれませんが、これは私にはショッピングカートのシナリオのように聞こえます。匿名のツアーとログインしたツアーを別々のテーブルに保存してみませんか?つまり、ユーザーがログインした後、匿名の「ショッピングカート」ツアーを別のテーブルの実際のツアー「注文」に変換しますか?

そうすれば、データを破壊することはありません。また、ログインしたばかりの人が、ログインする前にツアーを追加した人と同じであることをどうやって知ることができますか?

于 2010-12-15T19:13:30.550 に答える
0

あなたがやろうとしていることは、最初に競合するレコードを削除してから、新しいレコードを挿入することだと思います。これは役立つかもしれません...

mysql> select * from ToursCartsItems;
+----+--------+--------+-----------+
| Id | UserId | TourId | CreatedAt |
+----+--------+--------+-----------+
|  1 | old    |      1 |      NULL | 
|  2 | old    |      2 |      NULL | 
|  3 | new    |      1 |      NULL | 
|  4 | new    |      3 |      NULL | 
+----+--------+--------+-----------+
4 rows in set (0.00 sec)

mysql> delete from b using ToursCartsItems as a inner join ToursCartsItems as b on a.TourId = b.TourId where a.UserId = 'new' and b.UserId = 'old' and a.Id <> b.Id;

mysql> select * from ToursCartsItems;
+----+--------+--------+-----------+
| Id | UserId | TourId | CreatedAt |
+----+--------+--------+-----------+
|  2 | old    |      2 |      NULL | 
|  3 | new    |      1 |      NULL | 
|  4 | new    |      3 |      NULL | 
+----+--------+--------+-----------+
3 rows in set (0.00 sec)
于 2010-12-16T10:22:36.520 に答える