2011-12-23 24 views
7

Tôi đang cố gắng trả lại dữ liệu từ các hàng có ngày gần đây nhất của từng ứng cử viên riêng biệt_id. Nó trả về chính xác ngày gần đây nhất (cột created_unix), nhưng không phải là phần còn lại của dữ liệu từ hàng tương ứng.Trả lại dữ liệu từ các hàng có ngày gần đây nhất của từng ứng cử viên riêng biệt_id

SELECT candidate_id, message, max(created_unix), jobpost_id, staffuserid 
    FROM messages 
     WHERE employer_id='$employerid' AND last='company' 
      GROUP BY candidate_id 
+2

có thể trùng lặp của [Lấy hàng có giá trị Tối đa cho cột] (http://stackoverflow.com/questions/121387/), [MySQL: chọn tất cả các trường tương ứng bằng MAX và GROUP BY] (http: //stackoverflow.com/questions/1305056/mysql-selecting-all-corresponding-fields-using-max-and-group-by) – outis

Trả lời

5

Bạn group by tất cả mọi thứ không phải sử dụng một chức năng tổng hợp:

SELECT candidate_id, message, max(created_unix), jobpost_id, staffuserid 
    FROM messages 
     WHERE employer_id='$employerid' AND last='company' 
      GROUP BY candidate_id, message, jobpost_id, staffuserid 

Nếu message của bạn là khác nhau cho mỗi hàng và bạn muốn group by candidate_id, sau đó bạn phải không được sử dụng message. Trong trường hợp đó, chỉ cần xóa nó khỏi danh sách lựa chọn của bạn và bạn sẽ không cần nó trong danh sách group by của bạn. Cũng vậy với bất kỳ lĩnh vực nào khác mà bạn không sử dụng.

Hãy nhớ rằng, khi sử dụng chức năng tổng hợp, bạn phải chứa từng trường trong hàm tổng hợp hoặc group by. Nếu không, SQL sẽ không biết từ hàng nào để kéo dữ liệu cho hàng được trả về.

Cập nhật:

Sau khi nhìn thấy những gì bạn đang tìm kiếm, điều này sẽ làm các trick:

SELECT candidate_id, message, max(created_unix), jobpost_id, staffuserid 
    FROM messages 
     WHERE employer_id='$employerid' AND last='company' AND 
     created_unix = (
      SELECT max(subm.created_unix) 
      FROM messages subm 
      WHERE subm.candidate_id = messages.candidate_id 
     ) 
+0

Cảm ơn bạn đã phản hồi, Justin. Làm điều này sẽ liệt kê ra tất cả các hàng (mỗi hàng có một thông điệp duy nhất). Tôi chỉ muốn một hàng cho mỗi ứng cử viên riêng biệt mà đáp ứng ở đó WHERE tiêu chí. Không cần phải nhóm theo jobpost_id hoặc staffuserid vì chỉ có 1 cho mỗi ứng cử viên. – arrogantprick

+0

Nhưng có * là * cần phải làm điều đó. Khi bạn sử dụng các hàm tổng hợp, cho mỗi trường bạn quay trở lại, bạn phải sử dụng nó trong một hàm tổng hợp hoặc 'nhóm bởi'. Có vẻ như bạn không sử dụng trường thông báo, vì vậy, chỉ cần xóa nó khỏi câu lệnh 'select' của bạn và bạn sẽ không cần nó trong nhóm' của bạn'. –

+0

Tôi đang sử dụng trường thông báo khi tôi in nó ra trong một bảng. Toàn bộ vấn đề của tôi là nó đã in một thông báo từ hàng không chính xác (không phải hàng chứa trường max của trường created_unix). – arrogantprick

4
SELECT m1.* 
FROM messages as m1 
    LEFT OUTER JOIN messages AS m2 
    ON (m1.candidate_id = m2.candidate_id 
     AND (m1.created_unix < m2.created_unix) 
WHERE m2.created_unix is NULL 
AND employer_id='$employerid' AND last='company' 

này tham gia messages để cứ vào candidate_id và làm cho hàng với chọn tất cả ngày trong m2 lớn hơn mỗi ngày trong m1, thay thế NULL nếu không có ngày nào lớn hơn. Vì vậy, bạn nhận được NULL chính xác khi không có ngày nào lớn hơn trong đó candidate_id.

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