データを含むmysqlテーブル「table1」があります
id mailid currentstatus assignedto assignedtime logtime
4338 14928 assigned user1 4/15/2013 13:44 4/15/2013 13:44
4352 14928 followup user1 4/15/2013 13:44 4/15/2013 13:50
16297 14928 assigned user1 4/15/2013 13:44 4/29/2013 9:52
16300 14928 replied user1 4/15/2013 13:44 4/29/2013 9:55
5731 15710 assigned user2 4/17/2013 10:16 4/17/2013 10:17
5769 15710 followup user2 4/17/2013 10:16 4/17/2013 10:35
16281 15710 assigned user2 4/17/2013 10:16 4/29/2013 9:40
16291 15710 replied user2 4/17/2013 10:16 4/29/2013 9:48
各ユーザーが各メール ID で費やした時間を調べたい。
列の説明:
- id: (自動増分列)
- mailid: (電子メールの一意の ID)
- currentstatus: (メールの現在のステータス)
- assignedto: (電子メールが割り当てられているユーザー名)
- assignedtime: (電子メールが割り当てられた日時)
- logtime: (行の挿入日時、つまり現在のステータスの日時)
ID 4338 と 5731 はそれぞれ mailid 14928 と 15710 の最初の行であり、これらの ID の最後の行は 16300 と 16291 であり、常に現在のステータスが「返信済み」になります。
ここで、出力が必要です
(4352 のログ時間 - 4338 のログ時間) + (16300 のログ時間 - 16297 のログ時間)
これにより、user1 が mailid 14928 で費やした時間がわかります。
ここでよくあること:
- 最後の行の列 currentstatus は常に「返信」されます
- currentstatus の先行する 'assigned' で減算される各行
テーブルの更新方法:
これは電子メール管理ソリューションの一部であり、電子メールがユーザーに割り当てられ、ユーザーは電子メールに返信するか、フォローアップに入れて後で返信することができます。
以下の両方のケースで、ユーザーには電子メール (14928 と 15710) が割り当てられています。両方のユーザーがこれらの電子メールをフォローアップに入れており、この電子メールに返信する必要がある場合、これらの電子メールは再割り当てされてから返信されました。
助けてください!
望ましい出力は次のとおりです。
mailid assignedto timespent
14928 user1 00:08:55
15710 user2 00:26:57
これまでのところ、以下のクエリを作成できますが、このクエリを最適化する必要があります。
SELECT mailid,
assignedto,
sum(st) TimeSpent
FROM
( SELECT b.*,
CASE WHEN b.currentstatus = 'assigned'
THEN TIMESTAMPDIFF(SECOND, b.logtime, (SELECT a.logtime
FROM inbox_log a
WHERE a.mailid = b.mailid
AND a.logtime > b.logtime
ORDER BY a.table1 LIMIT 1))
ELSE 0
END st
FROM table1 b
WHERE logtime >= '2013-04-25') d
GROUP BY mailid,
assignedto;
http://sqlfiddle.comで問題に直面しているため、フィドルを作成できませんでした。
このクエリは、16,000 行で約 150 秒かかります。このクエリを最適化する方法についての提案