0

机がある:

CREATE TABLE `mytable` (
`user_id` INT(10) UNSIGNED NOT NULL,
`thing_id` VARCHAR(100) NOT NULL DEFAULT '',
`lock_date` DATETIME NOT NULL,
`lock_id` VARCHAR(36) NOT NULL,
PRIMARY KEY (`user_id`,`thing_id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;

そしてそこにいくつかの値:

INSERT INTO mytable(user_id,thing_id,lock_date,lock_id)
VALUES
(51082,'299ac9ff-2b2b-102d-8ff6-f64c971398c3','2012-03-16 00:39:12','ec7b2008-6ede-11e1-aac2-5924aae99221'),
(108325,'299ac9ff-2b2b-102d-8ff6-f64c971398c3','2013-02-05 19:30:03','7c6de986-6edd-11e1-aac2-5924aae99221'),
(108325,'d90b354d-4b5f-11e0-9959-47117d41cf4b','2012-03-16 00:47:41','1c243032-6ee0-11e1-aac2-5924aae99221');

user_id = 108325 のすべてのレコードを user_id = 51082 に委任したいのですが、両方のユーザーが同じ thing_id フィールドを持っている場合は、新しい方のみを残して (lock_date1 > lock_date2)、次の結果が得られるようにします。

51082,'299ac9ff-2b2b-102d-8ff6-f64c971398c3','2013-02-05 19:30:03','7c6de986-6edd-11e1-aac2-5924aae99221'
108325,'d90b354d-4b5f-11e0-9959-47117d41cf4b','2012-03-16 00:47:41','1c243032-6ee0-11e1-aac2-5924aae99221'

51082 には、'2012-03-16 00:39:12' の代わりに lock_date = '2013-02-05 19:30:03' という新しいレコードがあることに注意してください。

では、どうすれば行を更新し、重複したキーで新しいものを残すことができますか (特定のフィールドによって)?

ありがとう!

4

1 に答える 1

1
INSERT INTO
  mytable(user_id,thing_id,lock_date,lock_id)
VALUES
  (51082,'299ac9ff-2b2b-102d-8ff6-f64c971398c3','2012-03-16 00:39:12','ec7b2008-6ede-11e1-aac2-5924aae99221'),
  (108325,'299ac9ff-2b2b-102d-8ff6-f64c971398c3','2013-02-05 19:30:03','7c6de986-6edd-11e1-aac2-5924aae99221'),
  (108325,'d90b354d-4b5f-11e0-9959-47117d41cf4b','2012-03-16 00:47:41','1c243032-6ee0-11e1-aac2-5924aae99221')
ON DUPLICATE KEY UPDATE SET
  user_id = VALUES(user_id),
  lock_date = VALUES(lock_date),
  lock_id = VALUES(lock_id)
于 2013-02-16T11:23:32.763 に答える