我们为网店提供了一个自定义框架,我们希望添加一些新功能,例如其他人也可以查看。这应该显示其他人也看过的产品。因此,它应该显示已经查看过本书的其他人查看过的书籍。
我们有一个数据库可以记录用户查看哪些产品的日志。
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;
我们得到两个结果和相应金额的回报。但是,如果1个用户多次查看某个项目,他就能够操纵该查询。
因此,查询必须返回查看用户最多而不是查看次数最多的产品。我被困在查询中,你能帮帮我吗?
答案 0 :(得分:1)
如果此表仅用于此目的,您可以添加
UNIQUE KEY (`productId`, `userId`)
,因此用户“无法查看产品两次”。将insert-statement更改为
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.