3

データを含む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 で費やした時間がわかります。

ここでよくあること:

  1. 最後の行の列 currentstatus は常に「返信」されます
  2. 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 秒かかります。このクエリを最適化する方法についての提案

4

3 に答える 3

1

「関数」を使用して最適化できます。


最初に、アクションを実行したいレコードのみを生成する関数を作成する必要があります。

構文:

CREATE FUNCTION func_name ([func_parameter[,...]]) RETURNS type routine_body

DELIMITER $$
  CREATE FUNCTION hello_world(addressee TEXT)
    RETURNS TEXT
      LANGUAGE SQL -- This element is optional and will be omitted from subsequent examples
    BEGIN
      RETURN CONCAT('Hello ', addressee);
  END;
$$
DELIMITER ;

次のように実行します。

mysql> SELECT hello_world('Earth');
1 row in set (0.00 sec)

時間がかからず、あなたのために働くでしょう。

于 2013-05-01T09:20:19.830 に答える