2012-02-02 22 views
6

Tôi có một bảng đang nhận được hàng trăm yêu cầu mỗi phút. Vấn đề tôi gặp phải là tôi cần một cách để chỉ chọn các hàng đã được chèn vào trong 5 phút vừa qua. Tôi đang thử điều này:Chọn các hàng ít hơn 5 phút bằng DATE_SUB

SELECT count(id) as count, field1, field2 
FROM table 
WHERE timestamp > DATE_SUB(NOW(), INTERVAL 5 MINUTE) 
ORDER BY timestamp DESC 

Vấn đề của tôi là nó trả về 70k + kết quả và đếm. Tôi không chắc mình đang làm gì sai, nhưng tôi rất muốn được giúp đỡ về điều này. Ngoài ra, nếu có một cách để nhóm chúng theo phút để trông giống như sau:

| count | field1 | field2 | 
---------------------------- 

Tôi rất muốn được giúp đỡ và hướng dẫn về điều này, vì vậy hãy cho tôi biết suy nghĩ của bạn.

+0

loại của 'cột timestamp' là gì? – Tadeck

+0

@tadeck đó là một ngày giờ, điều đó có tạo nên sự khác biệt không? –

+3

Nó tạo ra sự khác biệt lớn, vì một số người sử dụng 'INT' để lưu dấu thời gian. Nó cũng khác với kiểu 'TIMESTAMP', vì' DATETIME' được xử lý theo nghĩa đen và không điều chỉnh cho múi giờ. Đây có thể là vấn đề - so sánh dấu thời gian của mục nhập được chèn gần đây với kết quả của 'CHỌN NGAY BÂY GIỜ();' và cho chúng tôi biết về các giá trị của cả hai. – Tadeck

Trả lời

2

Sau đây có vẻ như nó sẽ làm việc đó là hùng mạnh gần với những gì bạn có:

SELECT 
    MINUTE(date_field) as `minute`, 
    count(id) as count 
FROM table 
WHERE date_field > date_sub(now(), interval 5 minute) 
GROUP BY MINUTE(date_field) 
ORDER BY MINUTE(date_field); 

Note cột bổ sung để hiển thị phút và mệnh đề GROUP BY rằng tập hợp lên các kết quả vào phút tương ứng. Hãy tưởng tượng rằng bạn có 5 thùng nhỏ được dán nhãn trong 5 phút cuối cùng. Bây giờ hãy tưởng tượng bạn ném mỗi hàng đã được 4 phút vào thùng riêng của nó. count() sau đó sẽ đếm số lượng các mục được tìm thấy trong mỗi nhóm. Đó là hình ảnh nhanh về cách GROUP BY hoạt động. http://www.tizag.com/mysqlTutorial/mysqlgroupby.php có vẻ là một ghi chép phong nha về GROUP BY nếu bạn cần thêm thông tin.

Nếu bạn chạy điều đó và số lượng mục nhập trong mỗi phút có vẻ quá cao, bạn sẽ muốn thực hiện một số khắc phục sự cố. Hãy thử thay thế COUNT (id) bằng MAX (date_field) và MIN (date_field) để bạn có thể có được ý tưởng về loại ngày chụp. Nếu MIN() và MAX() nằm trong phạm vi, bạn có thể có nhiều dữ liệu được ghi vào cơ sở dữ liệu của mình hơn là bạn nhận ra.

Bạn cũng có thể kiểm tra kỹ rằng bạn không có ngày trong tương lai vì tất cả chúng sẽ là> now(). Các kiểm tra MIN()/MAX() được đề cập ở trên cũng nên xác định điều đó nếu đó là vấn đề.

+0

Câu trả lời hay bằng văn bản – phpmeh

10

Bạn không thực sự cần DATE_ADD/DATE_SUB, ngày số học đơn giản hơn nhiều:

SELECT COUNT(id), DATE_FORMAT(`timestamp`, '%Y-%m-%d %H:%i') 
FROM `table` 
WHERE `timestamp` >= CURRENT_TIMESTAMP - INTERVAL 5 MINUTE 
GROUP BY 2 
ORDER BY 2 
Các vấn đề liên quan