所以我有一个带有列
的'recent_viewed'表product|user|time
但是,如果用户查看他们已查看过的产品,则会创建一个新行。什么是最有效的方式来覆盖这种可能性(同时保持这是他们第一次看到它的可能性)?覆盖他们查看它的旧时间或删除旧表行(并同时创建新行)?我可以想到一些效率低下的方法(首先查询它是否在表中,但这需要多个语句),但我怀疑有更高效的东西。
INSERT INTO recent_viewed ...
真诚地感谢您的帮助。非常感谢业余爱好者。
答案 0 :(得分:3)
您可以在recently_viewed
,
IF EXISTS (SELECT * FROM recently_viewed WHERE user = "user_id")
BEGIN
#UPDATE query
END
ELSE
BEGIN
#INSERT query
END
答案 1 :(得分:1)
您可以将define(product,user)用作UNIQUE,例如,您可以将其设置为表的PRIMARY KEY:
CREATE TABLE tablename (
product INT,
user INT,
time DATETIME,
PRIMARY KEY (product, user)
);
(或者你也可以创建一个UNIQUE索引),然后使用INSERT INTO ... ON DUPLICATE查询:
INSERT INTO tablename (product, user, `time`)
VALUES (1, 1, '2015-01-01 10:00:00'),
ON DUPLICATE KEY UPDATE `time`=VALUES(`time`);
请参阅工作示例here。
答案 2 :(得分:1)
我强烈建议使用on duplicate key update
。这首先是user
/ product
上的唯一索引:
create unique index idx_recently_viewed_user_product on recently_viewed(user, product);
然后:
insert into recently_viewed(user, product, time)
values ($user, $product, $time)
on duplicate key update time = values(time);