2013-12-07 81 views
0

我們爲我們的網上商店定製了一個框架,我們希望添加一些新功能,如其他人也可以查看。這應該顯示已被其他人查看的產品。因此,它應該展示已被其他人查看過本書的圖書。MySQL其他人查看

我們有一個數據庫,用於保存用戶查看哪些產品的日誌。

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

如果只用於此目的這個表可以添加

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. 
+0

嗨,不幸的是這臺具有多功能的使用。例如每個產品的視圖數量。所以我們真的只想找到其他看過這個產品的最獨特的產品。 –

+0

@PeterFox更新了我的答案(最後一個查詢) –