2011-02-10 21 views
5

En son satırları mysql tablomdan benzersiz bir değerle almam gerekir. Basit tablo düzeni zaman damgası (şimdi()) ve bir kullanıcı adı sütundur. Tablo, yeni verileri saniyede birkaç kez alıyor ve kullanıcı adının benzersiz olduğu en son satıra ihtiyacım var.MYSQL Sorgu: son 30 dakikadaki son zaman damgası + benzersiz değer

SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp < (now() - interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 

sorgu, son değerleri dönmez görünüyor muhtemelen son 30 dakikaya bakmak çalışıyorsanız grup daha sonra, ben istemiyorum şey ...

+0

her biri için en son satır istiyorum son 30 dakika içinde eklenen kullanıcı? Ayrıca, 'timtamp' mysql içinde ayrılmış bir kelime olduğunu unutmayın. Alan için farklı bir isim kullanmalı veya backticks ile "kaçmak" gerekir. –

+0

Evet, haklısın, sütunum zaman damgası değeri için başka bir isim kullanıyor, bu sadece bir örnek oldu :) Teşekkürler bahşiş için zaten! – HyperDevil

cevap

2
SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp > (now() - interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 
6

yapıyor çünkü "Daha az" yerine "daha büyük" kullanmak istediğinizi düşünüyorum.

... WHERE timestamp > (now() - interval 30 minute) ... 
+0

+1 Göndermek için tıklayın. Nice - daha hızlı yazarsın. ;-) –

+0

Oops evet bunu gördüm, ancak sonuç hala en son değerleri göstermiyor. – HyperDevil

+0

@HyperDevil: Satırlar 2/saniye hızında eklenirse, büyük olasılıkla sorgunun sonuçlarını canlı verilere karşı doğrulamak zor olacaktır. –

3

Eğer iş, daha hızlı bir çözüm JOIN Ben SOL üzerinde çalışıyorum DB üzerinde JOIN SOL kullanmak olabilir gelmez yazdıklarını aslında iki kat daha hızlı olsa da w almak avantaj/Bu w aynı kullanıcı w/zaman damgası ile sonraki satıra/bla her satır eşleşir ve satırları bir sonraki yok seçer

SELECT * 
    FROM `bla` 
    WHERE bla.created_at > (now() - interval 30 minute) AND (next_bla.created_at IS NULL) 
    LEFT JOIN bla next_bla ON bla.username = next_bla.username AND bla.created_at < next_bla.created_at 
    ORDER BY bla.created_at DESC 

: en son satırlardan tüm sütunlar bu bilgi isterseniz satır (next_bla.created_at IS NULL), yani en son satırlardır.

Performansı iyileştirmek için LIMIT deyimini de kullanabilirsiniz.

Bu ayrıntılı olarak işler ve net dille BY nasıl GROUP açıklayan iyi bir yazı olduğunu: http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html

Andomar tarafından başka benzer cevap - MySQL "Group By" and "Order By"

0

SELECT MAX(timestamp) as timestamp, username 
    FROM bla 
    WHERE timestamp > date_sub(now(), interval 30 minute) 
    GROUP BY username 
    ORDER BY timestamp DESC 
Yani temelde
İlgili konular