2016-03-27 4 views
0

オープン環境でプロダクション環境が導入され、1000人以上のユーザーが登録されています。私は、ソフトフォンの登録ごとにlocation_historyテーブルに行を挿入するトリガーを作成しました。表registration_historyは、すべてのSIPユーザーの登録レコードを保持しています。ロケーション履歴の説明である:MySQLのクエリで、1時間あたりの最大時間を除くすべてのデータを削除します。

のID INT(10)符号なし ユーザ名CHAR(64)
ドメインCHAR(64)
接触CHAR(255)
受信CHAR(128)
パスチャー(255 )
日時
Qフロート(10,2)
callid CHAR(255)
のCSeq INT(11)
LAST_MODIFIED日時
満了のフラグINT(11)
CFLAGS CHAR(255)
user_agentのチャー(255)
ソケットCHAR(64)
方法はint(11)
sip_instanceチャー(255)
ATTRチャー(255)

今、registration_historyで1時間の最大有効期限を持つレコードを1つだけ保持し、残りのレコードを削除したいとします。私にこれを行う方法を教えてください。 @tommcattによって提案されたクエリをthisスレッドで追跡しましたが、依然としてデータベースに1時間の複数のレコードがあります。私の照会は:

DELETE ENTRY FROM location_history ENTRY 
LEFT JOIN(
    SELECT username, Date(expires) TheDate, Hour(expires) TheHour, Max(expires) MaxTime 
    FROM location_history WHERE expires BETWEEN '2016-03-26 00:00:00' and '2016-03-27 00:00:00' 
    GROUP BY username, TheDate, TheHour 
) AS T1 
    ON T1.MaxTime = ENTRY.expires 
    WHERE T1.MaxTime is null AND ENTRY.expires BETWEEN '2016-03-26 00:00:00' and '2016-03-27 00:00:00' 

このクエリーは毎日cronで実行されますが、自分の要件に従って動作しません。実行後、1時間に複数のレコードが残っています。

+0

'MySQLの:

あなたは時間あたり1つのレコードだけをしたい場合は、サブクエリからusernameを削除'<>' SQL Server'です。 –

答えて

0

おそらく、ユーザー名ごとにという1つのエントリを意味します。。もしそうなら、あなたは含める必要があるというon句の:

DELETE lh 
    FROM location_history lh LEFT JOIN 
     (SELECT username, Date(expires) as TheDate, 
       Hour(expires) as TheHour, Max(expires) as MaxTime 
      FROM location_history 
      WHERE expires BETWEEN '2016-03-26' and '2016-03-27' 
      GROUP BY username, TheDate, TheHour 
     ) lh2 
     ON lh2.MaxTime = lh.expires AND lh2.username = lh.username 
    WHERE lh2.MaxTime is null AND 
      lh.expires BETWEEN '2016-03-26' and '2016-03-27'; 

EDIT:

DELETE lh 
    FROM location_history lh LEFT JOIN 
     (SELECT Date(expires) as TheDate, 
       Hour(expires) as TheHour, Max(expires) as MaxTime 
      FROM location_history 
      WHERE expires BETWEEN '2016-03-26' and '2016-03-27' 
      GROUP BY TheDate, TheHour 
     ) lh2 
     ON lh2.MaxTime = lh.expires 
    WHERE lh2.MaxTime is null AND 
      lh.expires BETWEEN '2016-03-26' and '2016-03-27'; 
+0

を使用しているものを選択してくださいはい、1時間あたりユーザー名ごとに1つのレコードが必要です。最初のものを適用させてください。 –

+0

クエリはうまくいきましたが、同じmax(expires)値を持つレコードが2つある場合、このクエリは両方を保持します。 –

関連する問題