2011-10-20 25 views
13

Đây là cấu trúc bảngLàm thế nào để CHỌN bằng MAX (ngày)?

CREATE TABLE `reports` (
    `report_id` int(11) NOT NULL auto_increment, 
    `computer_id` int(11) NOT NULL default '0', 
    `date_entered` datetime NOT NULL default '1970-01-01 00:00:00', 
    `total_seconds` int(11) NOT NULL default '0', 
    `iphone_id` int(11) default '0', 
    PRIMARY KEY (`report_id`), 
    KEY `computer_id` (`computer_id`), 
    KEY `iphone_id` (`iphone_id`) 
) ENGINE=MyISAM AUTO_INCREMENT=120990 DEFAULT CHARSET=latin1 

Tôi cần một tuyên bố SELECT rằng sẽ liệt kê các report_id mỗi computer_id từ mới nhất vào date_entered, và tôi không có đầu mối làm thế nào để làm điều đó. Bất cứ ai có thể chỉ cho tôi đi đúng hướng? Thx trước.

Trả lời

28

này nên làm điều đó:

SELECT report_id, computer_id, date_entered 
FROM reports AS a 
WHERE date_entered = (
    SELECT MAX(date_entered) 
    FROM reports AS b 
    WHERE a.report_id = b.report_id 
     AND a.computer_id = b.computer_id 
) 
+2

Gần như. Tôi đã bỏ qua "a.report_id = b.report_id" và điều đó đã xảy ra. Cảm ơn bạn – poetter747

+2

Đây là một chút không hiệu quả bởi vì bạn đang tạo quá nhiều truy vấn phụ. Thay vào đó, hãy thử sử dụng truy vấn con không tương quan. https://dev.mysql.com/doc/refman/5.6/en/example-maximum-column-group-row.html – Pablo

+0

Pablo là chính xác. Việc lọc có thể được thực hiện trước đó bằng cách tham gia một truy vấn phụ, do đó tiết kiệm hiệu suất. – twicejr

11

Bạn chỉ muốn nó hiển thị date_entered cuối cùng hoặc để đặt hàng bằng cách bắt đầu với last_date được nhập?

SELECT report_id, computer_id, date_entered 
FROM reports 
GROUP BY computer_id 
ORDER BY date_entered DESC 
-- LIMIT 1 -- uncomment to only show the last date. 
+2

Khi id làm được điều này, tôi nhận được sai report_id. Tôi đã kiểm tra câu lệnh bằng WHERE computer_id = 30. Kết quả là report_id đầu tiên của tất cả các report_ids được tìm thấy kết hợp với date_entered mới nhất – poetter747

3

Accordig này: https://bugs.mysql.com/bug.php?id=54784 đúc như char nên làm các trick:

SELECT report_id, computer_id, MAX(CAST(date_entered AS CHAR)) 
FROM reports 
GROUP BY report_id, computer_id 
+0

Điều này sẽ giúp bạn có được ngày tối đa, nhưng không nhất thiết phải là các giá trị khác từ cùng một hàng. – Vincent

0
SELECT report_id, computer_id, date_entered 
FROM reports 
WHERE date_entered = (
    SELECT date_entered 
    FROM reports 
    ORDER date_entered 
    DESC LIMIT 1 
) 
+1

Cảm ơn bạn đã trích đoạn mã này, đoạn mã này có thể cung cấp một số trợ giúp tức thì, có giới hạn. Một lời giải thích thích hợp [sẽ cải thiện rất nhiều] (// meta.stackexchange.com/q/114762) giá trị lâu dài của nó bằng cách hiển thị * tại sao * đây là một giải pháp tốt cho vấn đề, và sẽ làm cho nó hữu ích hơn cho người đọc trong tương lai các câu hỏi tương tự khác. Vui lòng [sửa] câu trả lời của bạn để thêm một số giải thích, bao gồm các giả định bạn đã thực hiện. –

Các vấn đề liên quan