MySQL其他人观看过

时间:2013-12-07 23:36:24

标签: mysql sql

我们为网店提供了一个自定义框架,我们希望添加一些新功能,例如其他人也可以查看。这应该显示其他人也看过的产品。因此,它应该显示已经查看过本书的其他人查看过的书籍。

我们有一个数据库可以记录用户查看哪些产品的日志。

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个用户多次查看某个项目,他就能够操纵该查询。

因此,查询必须返回查看用户最多而不是查看次数最多的产品。我被困在查询中,你能帮帮我吗?

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.