2016-03-27 15 views
0

Üretim ortamına konuşlandırılan opensips'lerim var ve binden fazla kullanıcı kayıtlı ve her SIP Telefon kayıt işlemini 1 dakika sonra yeniliyor. Yumuşak telefonun her kaydı için location_history tablosuna bir satır ekleyen bir tetik yazdım. Tablo registration_history her yudum kullanıcısının kayıt kaydını tutuyor. Konumu tarihin açıklamasıdır:MySQL sorgusu saat başına azami sürenin dışında kalan tüm verileri silmek için

id int (10) imzasız adı Char (64)
alanı Char (64)
temas Char (255)
alınan karakter (128)
yol Char (255)
tarih saat
q şamandıra (10,2)
CallID kömür (255)
cseq int (11)
last_modified başlangıç ​​tarihi
sonabayrakları (11)
derleme-kömür (255)
user_agent kömür (255)
soket karakter (64)
yöntem int (11)
sip_instance kömür (255)
attr kömür (255)

int

Şimdi, registration_history'de bir saat içinde azami süresiyle sadece bir kayıt tutmak ve geri kalanını silmek istiyorum. Lütfen bana bunu nasıl yapacağım konusunda yönlendirin. @tommcatt tarafından this ileti dizisinde önerilen sorgulamayı takip ettim ancak yine de veritabanında bir saatin birden fazla kaydı var. Sorgum:

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' 

Bu Sorgu, her gün bir cron içinde yürütülür, ancak benim gereksinimime göre çalışmaz. Uygulamadan sonra bir saat içinde hala birden fazla kayıt var.

+0

'Mysql:

saatte sadece bir kayıt istiyorsanız, alt sorgu username kaldırmak '<> SQL Server '. Kullandığınız birini seçin –

cevap

0

Muhtemelen, kullanıcı adı başına bir girişini kastediyorsunuz. Eğer öyleyse, dahil etmek gerektiğini on fıkrada:

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'; 

DÜZENLEME:

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

Evet doğru Saat başına kullanıcı adı başına bir rekor gerekiyor. İlkini bana vereyim. –

+0

Sorgu, ancak çalıştı, ancak aynı max (expires) değeriyle iki kayıt varsa, bu sorgu her ikisini de tutar. –

İlgili konular