ユーザーのクリックを追跡するデータベースがあります。誰かが同じものを 2 回クリックすると、同じタイムスタンプでデータベースに重複したエントリが作成される可能性があります。
重複ではなく一意のタイムスタンプを持つ結果のみを返すようにクエリを変更する方法はありますか?
$stmt1 = $dbConn1->prepare("
SELECT count(*)
FROM asset_lookup
");
ユーザーのクリックを追跡するデータベースがあります。誰かが同じものを 2 回クリックすると、同じタイムスタンプでデータベースに重複したエントリが作成される可能性があります。
重複ではなく一意のタイムスタンプを持つ結果のみを返すようにクエリを変更する方法はありますか?
$stmt1 = $dbConn1->prepare("
SELECT count(*)
FROM asset_lookup
");
ノート:
句で使用するため、join toはjoinproduct
と100%同等です。それ以外に、テーブルに存在せず、テーブル(存在する場合)のみに存在する製品のクリック数をカウントするポイントはありますか?INNER
product.product_type_id = 2
WHERE
product
asset
句で使用するため、join toはLEFT
joinevent
と100%同等です。INNER
event.activation_date
WHERE
への参加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 ;
明確なキーワードを探していると思います。このスレッドを読んでください。