所以我有一个列为的"recently_viewed"表
product|user|time
但是,如果用户查看了他们已经查看过的产品,则会创建新行。覆盖这种可能性的最有效方法是什么(同时保持这是他们第一次看到的可能性)?覆盖他们查看的旧TIME,还是删除旧表行(同时创建新行)?我可以想出一些效率低下的方法(首先查询它是否在表中,但这需要多个语句),但我怀疑还有效率高得多的方法。
插入最近查看的(_V)。。。
衷心感谢您的帮助。这是一个业余爱好者非常赞赏的。
您可以检查recently_viewed
、中是否存在用户的记录
IF EXISTS (SELECT * FROM recently_viewed WHERE user = "user_id")
BEGIN
#UPDATE query
END
ELSE
BEGIN
#INSERT query
END
您可以使用define(product,user)作为UNIQUE,例如,您可以将其设置为表的PRIMARY KEY:
CREATE TABLE tablename (
product INT,
user INT,
time DATETIME,
PRIMARY KEY (product, user)
);
(或者您也可以创建一个UNIQUE索引),然后使用INSERT INTO。。。关于重复查询:
INSERT INTO tablename (product, user, `time`)
VALUES (1, 1, '2015-01-01 10:00:00'),
ON DUPLICATE KEY UPDATE `time`=VALUES(`time`);
请参阅此处的工作示例。
我强烈建议使用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);