0

PHPコードなしで1つのクエリでこれを行う方法について、私は頭を悩ませてきました。

簡単に言えば、電子メール アクティビティを記録するテーブルがあります。この例のために、データは次のとおりです。

recipient_id     activity     date
1                delivered    2011-08-30
1                open         2011-08-31
2                delivered    2011-08-30
3                delivered    2011-08-24
3                open         2011-08-30
3                open         2011-08-31

目標: 24 時間以内にメールを開封した受信者の数を示す単一の数字をユーザーに表示したいと考えています。

EG "24 時間以内にメールを開いたユーザー: 13 人の読者"

上記のサンプルデータの場合、値は「1」になります。(受信者 1 はメールを受け取り、翌日開封しました。受信者 2 は開封せず、受信者 3 は 5 日間待機しました。)

単一のクエリで目標を表現する方法を考えられる人はいますか?

注意: カウントするには、人物に「配信済み」タグと少なくとも 1 つの「開封済み」タグが必要です。各「オープン」タグは、受信者ごとに 1 回だけカウントされます。

**編集**申し訳ありませんが、MySQLを使用しています

4

3 に答える 3

2

これはmysqlのバージョンです。

select count(distinct recipient_id)
from email e1
where e1.activity = 'delivered'
  and exists
        (select * from email e2
         where e1.recipient_id = e2.recipient_id
           and e2.activity = 'open'
           and datediff(e2.action_date,e1.action_date) <= 1)

基本原則は、24 時間以内に開封済みの受信者の配信済み行を検索することです。

これdatediff()は、mysql で日付計算を行う良い方法です。他のデータベースでは、このステップの正確な方法が異なります。残りの SQL はどこでも機能します。

SQLFiddle はこちら: http://sqlfiddle.com/#!2/c9116/4

于 2012-09-01T03:05:01.880 に答える
0

テストされていませんが、動作するはずです ;) 使用している SQL 方言がわからないので、TSQL DATEDIFF関数を使用しました。

select distinct opened.recipient_id -- or count(distinct opened.recipient_id) if you want to know number
from actions as opened 
inner join actions as delivered 
on opened.recipient_id = delivered.recipient_id and delivered.activity = 'delivered'
where opened.activity = 'open' and DATEDIFF(day, delivered.date, opened.date) <= 1

編集:開封と配達を混同していました-現在は交換されています。

于 2012-09-01T03:03:07.803 に答える
0

前提:MySql、テーブルは「TABLE」と呼ばれます

わかりました、実行するテーブルのコピーがないため、これについて 100% ではありませんが、次のようなことができると思います。

SELECT COUNT(DISTINCT t1.recipient_id) FROM TABLE t1
INNER JOIN TABLE t2 ON t1.recipient_id = t2.recipient_id AND t1.activity != t2.activity
WHERE t1.activity in ('delivered', 'open') AND t2.activity in ('delivered', 'open')
AND ABS(DATEDIFF(t1.date, t2.date)) = 1

基本的に、テーブルをそれ自体に結合しています。アクティビティは一致しませんが、recipient_ids は一致し、ステータスは「配信済み」または「オープン」です。最終的に得られるのは、次のような結果です。

1 delivered 2011-08-30 1 open 2011-08-31

次に、2 つの日付の差分を取り (絶対値を使用します。どちらの順序になるかわからないため)、それが 1 (または 24 時間) であることを確認します。

于 2012-09-01T03:04:06.930 に答える