我们的网店有一个自定义框架,我们想添加一些新功能,就像其他功能一样。这应该显示其他人也看过的产品。因此,它应该显示其他看过这本书的人看过的书。
我们有一个数据库,可以记录用户查看过哪些产品的日志。
CREATE TABLE `log_products_viewed` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`productId` bigint(11) DEFAULT NULL,
`userId` bigint(11) DEFAULT NULL,
`createdAt` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=84 DEFAULT CHARSET=latin1;
然后,我们想对其他人也看过的产品进行查询。我们尝试了一些方法,但这是正确的查询吗。
SELECT productId,
Count(productId) AS viewAmount
FROM log_products_viewed
WHERE userid IN (SELECT DISTINCT( userid ) AS members
FROM log_products_viewed
WHERE productId = '396')
AND productId <> '396'
GROUP BY productId
ORDER BY viewAmount DESC
LIMIT 0, 2;
我们得到一个包含两个结果和相应金额的回报。但是,如果一个用户多次查看一个项目,他就可以操作查询。
因此,查询必须返回用户浏览次数最多而不是浏览次数最多的产品。我陷入了困境,你能帮我吗?
如果此表仅用于此目的,则可以添加
UNIQUE KEY (`productId`, `userId`)
因此用户"不能两次查看产品"。将插入语句更改为
INSERT INTO log_products_viewed (productId, userId) VALUES (?, ?) ON DUPLICATE KEY IGNORE
-- or if you want to update the date
INSERT INTO log_products_viewed (productId, userId) VALUES (?, ?) ON DUPLICATE KEY UPDATE lastViewedAt = CURRENT_TIMESTAMP()
以避免警告。
这也有助于保持表的小型化,从而加快SELECT查询的速度。
否则:
SELECT productId,
Count(DISTINCT userid) AS viewAmount
FROM log_products_viewed
WHERE etc. etc.