2011-02-10 38 views
5

Tôi cần truy xuất các hàng mới nhất có giá trị duy nhất từ ​​bảng mysql của tôi. Bố cục bảng đơn giản là dấu thời gian (bây giờ()) và cột tên người dùng. Bảng sẽ nhận dữ liệu mới một vài lần trong một giây và tôi cần hàng mới nhất trong đó tên người dùng là duy nhất.Truy vấn MYSQL: dấu thời gian mới nhất + giá trị duy nhất trong 30 phút qua

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

Dường như truy vấn này không trả lại các giá trị mới nhất, có lẽ vì nhóm đang làm một cái gì đó tôi không muốn ...

+0

Vì vậy, về cơ bản bạn muốn hàng gần đây nhất cho mỗi người dùng đã được chèn trong vòng 30 phút qua? Ngoài ra, hãy lưu ý rằng 'dấu thời gian' là một từ dành riêng trong mysql. Bạn nên sử dụng tên khác cho trường hoặc "thoát" bằng dấu gạch chéo ngược. –

+0

Có bạn là chính xác, cột của tôi sử dụng một tên khác cho giá trị dấu thời gian này chỉ là một ví dụ :) cảm ơn cho tip anyway! – HyperDevil

Trả lời

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

Nếu bạn đang cố gắng nhìn vào 30 phút cuối cùng, sau đó Tôi nghĩ bạn muốn sử dụng "lớn hơn" thay vì "nhỏ hơn".

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

+1 Vừa mới nhấp vào Gửi. Nice - bạn gõ nhanh hơn. ;-) –

+0

Rất tiếc, tôi đã thấy điều đó, nhưng kết quả vẫn không hiển thị các giá trị mới nhất. – HyperDevil

+0

@HyperDevil: Nếu các hàng được chèn vào với tốc độ 2/giây, có thể sẽ khó khăn để xác thực kết quả truy vấn đối với dữ liệu trực tiếp. –

3

Trong khi những gì bạn đã viết không làm việc, một giải pháp nhanh hơn có thể sử dụng một LEFT JOIN Trên DB Tôi đang làm việc trên LEFT JOIN thực sự là nhanh gấp hai lần w/thêm tiền thưởng mà bạn nhận được tất cả các cột từ hàng gần đây nhất nếu bạn muốn điều đó thông tin:

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 

này phù hợp với tất cả các hàng trong bla w/hàng tiếp theo bởi dấu thời gian w/cùng tên người dùng và chọn các hàng mà không có một kế tiếp hàng (next_bla.created_at IS NULL) tức là chúng là các hàng gần đây nhất.

Bạn cũng có thể sử dụng mệnh đề LIMIT để cải thiện hiệu suất.

Đây là một bài viết tốt mà giải thích cách GROUP BY tác phẩm một cách chi tiết và ngôn ngữ rõ ràng: http://dev.mysql.com/tech-resources/articles/debunking-group-by-myths.html

Một câu trả lời tương tự của Andomar - 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 
Các vấn đề liên quan