2012-12-03 136 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 ;