2016-03-21 26 views
0

Bir MySQL sorgu sorum var.Saat başına aktif kullanıcı sayısını iki datetime girişine göre sayma

Web uygulamamda, "dinlenen" i içeren bir MySQL veritabanı tablosundaki "Shoutcast" sunucumdaki aktif dinleyicileri kaydediyorum ve ne zaman ayarlandıkları için bir datetime alanı ve "güncellenmiş" bir detetime alanı Sunucu, Shoutcast sunucusunu (her dakika) sorguladı. Ayrıca, aynı zamanda, dinleme oturumunun saniye cinsinden süresini ve her oturuma özgü olan kullanıcı kimliğini (kullanıcı oturumu kimliği) de alıyorum.

Ne yapmak isterim, saat başına dinleyici sayısını sayabiliriz, örneğin 13:00 = 20 dinleyici, ancak sadece ayarlanmış olanları değil, "oluşturulmuş" datetime alanını da dahil etmek istiyorum, ama Ayrıca, bir önceki saatten beri dinleyen tüm dinleyiciler, bu yüzden "update" datetime alanı.

Bunu başarmak için hangi sorguya ihtiyacım var? Bir seferde sadece 1 gün sonuç üretebilirim.

"COUNT (id) AS vuruşu" ve "GROUP BY" ile benzer bir şeyi nasıl kullanacağını anlıyorum, ancak "update" datetime alanı sürekli olduğundan, datetime alanlarını nasıl etkileyeceğimi bilmiyorum. Kullanıcı hala dinlediği sürece güncellendi. Ve bazı kullanıcılar 3 saat dinlemeye devam edebilirler +. Düzenleme

veritabanı şeması ana parçaları olan: id (int 20), oluşturulan (datetime), güncelleştirilmiş (datetime), uid (20 int), süre (int 10).

istenen sonucu benzer bir şey olacaktır:

(Süre/lan) 0900 => 10, 1000 => 15 => 5 1100 1200 => 8 1300 => 25

SEÇ ülke, COUNT (id) listeners_log NEREDEN vurur AS -: vesaire ...

Bu

tarafından grubunu kullanır ve) (sayım ı ülkeye göre sonuçları filtrelemek için kullandığınız bir sorgu olduğunu YIL (oluşturulmuş) = YIL (ŞİMDİ()) VE AY (oluşturulan) = AY (ŞİMDİ()) VE süresi> = 60

Sorgunun sonunda, 60 saniyeden daha kısa olan oturumları filtrelemek için eklenmiş bir filtre de vardır.

Biraz daha fazla detay vermek için, oluşturulan alan bir kullanıcı bir dinleme oturumu bağladığında/başladığında yansır. Örneğin, oluşturulan alana yansıyan 2016-03-21 15:00:00 saatleri arasında ayarlanır. Ancak hala 1 saat içinde dinliyorlarsa, güncelleme alanı 2016-03-21 16:00:00 öğelerini okuyacaktır, ancak oluşturulan alan aynı kalacaktır.

Güncelleme:

aşağıdaki SQL ile geldim, ama bu sadece yaratılan alanıyla belirtilen açmasının bağlantı, sayar ve bir kullanımın sonraki bir saatten bağlı kalırsa yok sayar.

SEÇ SAAT (oluşturulan), COUNT (id)

+0

Sorgunun üzerinde çalışmasını istediğiniz tablo için bir şema belirtebilir misiniz? Ayrıca, hata ayıklamaya yardımcı olmak için zaten denediğiniz sorgunuz var mı? – stratedge

+0

db şema örnek verisine ve arzu çıkışına ihtiyacımız var. \t Lütfen [** Nasıl Yapılır **] 'ı okuyun (http://stackoverflow.com/help/how-to-ask) \t \t Burada [** START **] için harika bir yer var. http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/) Sorularınızın kalitenizi nasıl geliştirdiğini öğrenmek ve daha iyi cevaplar almak için. –

+0

Dolayısıyla, yalnızca 'update' datetime alanında sorgulamanız gerekecek çünkü yeni bir kullanıcı bile 'create' datetime ve 'update' datetime altında bir sonraki güncellemeyle birlikte oluşturulsa bile, artık endişeleriniz olacak. sadece belirli bir saat için 'update' tarih saatini sorgulamak için. –

cevap

0

Yani sadece 'güncelleme' sorgulamak için ihtiyacı olacaktır (oluşturulan) SAAT tarafından listeners_log İTİBAREN vurur GİBİ TARİH (oluşturulan) = CURDATE() grubu datetime alan, yeni bir kullanıcı girilse bile, 'update' datetime ve bir sonraki güncellemede 'update' datetime ile oluşturulduğundan, endişeniz sadece belirli bir saat için 'update' tarih saatini sorgulamak olacaktır.

SELECT COUNT(id) FROM TABLE_NAME 
WHERE update_Field BETWEEN DATE(NOW() - INTERVAL 1 HOUR); 

Size yardımcı olması için örnek bir sorgu budur, test etmek için şuanım yok. Yolunuzu değiştirin ve Çalışmıyorsa bildirin.

+0

Soruyu güncellemedim. Kullanıcı sunucuya bağlandığında oluşturulan alan bir kez ayarlanır. Ardından, o satırdaki her bir ardışık güncelleştirme, dinlemeye devam ettikçe, oturum devam ederken güncelleme alanının güncellenmesini sağlar (adın içinde ipuçları). Böylece, 2016-03-21 15:00:00 saatleri arasında, oluşturulan alana yansıyan ayarlar. Ama eğer hala 1 saat içinde dinliyorlarsa, güncelleme alanı 2016-03-21 16:00:00 – mattauckland

+0

'u okuyacaktır. Daha sonra 'WHERE update_Field DAHA FAZLA BİÇİMDE' ORTAĞI 'alanına' OR 'maddesini ekleyebiliriz. NOW() - ARALIĞI 1 sAAT) (NOW() TARİH ARASINDAKİ VEYA create_Field - Eğer geliyorlar NEREDE (küçük bir şaka, üzgünüm) gördüğüm ARALIĞI 1 sAAT) ' –

+0

, ama bu sorguda yalnızca geçerli saat dayalı çalışır ediyorum . Soruyu, geldiğim bir şeyle güncelledim, ancak istenen sonucu elde etmek için bir OR yan tümcesi kullanabilir miyim? – mattauckland

İlgili konular