2012-12-03 137 views
0

我有一個數據庫跟蹤用戶點擊。如果有人兩次點擊同一個事物,它可能會在數據庫中產生具有相同時間戳的重複條目。MySQL查詢選擇唯一時間戳

有沒有辦法將我的查詢修改爲只返回帶有唯一時間戳的結果,而不是重複項。

$stmt1 = $dbConn1->prepare(" 
    SELECT count(*) 
    FROM asset_lookup 
    "); 
+0

當有人點擊創建什麼項目嗎? 'timestamp'和'product_id'? – Horen

+0

@霍恩,是的。 asset_lookup是使用時間戳值創建的。那是我追求的桌子。 – Jako

+0

所以當用戶點擊兩次時,就是這樣的:'timestamp = 1','product_id = 1'和第二個入口'timestamp = 2','product_id = 1'?你想只有一排回來?我理解正確嗎? – Horen

回答

1

注:

  • 的加盟product相當於一個INNER 100%加入,因爲你的WHERE子句中使用product.product_type_id = 2。除此之外,對於product表中不存在且僅在asset表(如果有)的表中不存在的產品,點數是否有點數?

  • LEFT加盟event相當於100%的INNER加入,因爲你的WHERE子句中使用event.activation_date

  • 加入到tracking_product_lookup似乎完全沒用。

  • COUNT(*)可能會給外部連接帶來錯誤的結果。 COUNT(*)對中間結果集中的行進行計數,並且外部連接生成某些列中含有空值的行(例如,根本沒有點擊的產品仍將顯示計數爲1)。

  • 要回答實際問題,如果要計算不同的時間戳,請使用COUNT(DISTINCT column)而不是COUNT(*)

的查詢將被寫成:

SELECT product.id, product.name, 
     count(DISTINCT asset_lookup.timestamp) 
FROM asset_lookup 
    JOIN product ON asset_lookup.product_id = product.id 
    JOIN event ON asset_lookup.event_id = event.id 
WHERE asset_lookup.event_id = ? 
    AND product.product_type_id = 2 
    AND asset_lookup.timestamp > event.activation_date 
GROUP by asset_lookup.product_id ;