ユーザーのクリックを追跡するデータベースがあります。誰かが同じものを 2 回クリックすると、同じタイムスタンプでデータベースに重複したエントリが作成される可能性があります。
重複ではなく一意のタイムスタンプを持つ結果のみを返すようにクエリを変更する方法はありますか?
$stmt1 = $dbConn1->prepare("
SELECT count(*)
FROM asset_lookup
");
ユーザーのクリックを追跡するデータベースがあります。誰かが同じものを 2 回クリックすると、同じタイムスタンプでデータベースに重複したエントリが作成される可能性があります。
重複ではなく一意のタイムスタンプを持つ結果のみを返すようにクエリを変更する方法はありますか?
$stmt1 = $dbConn1->prepare("
SELECT count(*)
FROM asset_lookup
");
ノート:
句で使用するため、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 ;
明確なキーワードを探していると思います。このスレッドを読んでください。