0

ユーザーのクリックを追跡するデータベースがあります。誰かが同じものを 2 回クリックすると、同じタイムスタンプでデータベースに重複したエントリが作成される可能性があります。

重複ではなく一意のタイムスタンプを持つ結果のみを返すようにクエリを変更する方法はありますか?

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

2 に答える 2

1

ノート:

  • 句で使用するため、join toはjoinproductと100%同等です。それ以外に、テーブルに存在せず、テーブル(存在する場合)のみに存在する製品のクリック数をカウントするポイントはありますか?INNERproduct.product_type_id = 2WHEREproductasset

  • 句で使用するため、join toはLEFTjoineventと100%同等です。INNERevent.activation_dateWHERE

  • への参加tracking_product_lookupは完全に役に立たないようです。

  • COUNT(*)、外部結合で間違った結果をもたらす可能性があります。COUNT(*)中間結果セットの行をカウントし、外部結合により、一部の列にNullが含まれる行が生成されます(たとえば、クリックがまったくない製品でも、カウントは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 ;
于 2012-12-03T20:22:46.523 に答える
1

明確なキーワードを探していると思います。このスレッドを読んでください。

mysql クエリ: SELECT DISTINCT column1、GROUP BY column2

于 2012-12-03T20:14:00.970 に答える