Trong hệ thống của tôi, tôi có khách hàng. Khách hàng có các chương trình. Tôi muốn hiển thị một danh sách các khách hàng, hiển thị chương trình hoạt động mới nhất của họ (nếu nó tồn tại).Đặt hàng trong nhóm theo?
Do đó, chúng tôi có một cái gì đó như thế này:
SELECT *
FROM clients AS client
JOIN programs AS program ON client.id=program.client_id
GROUP BY client.id
ORDER BY program.close_date=0 DESC, program.close_date DESC
close_date=0
nghĩa là chương trình không được đóng lại. Vì vậy, nó sẽ đưa các chương trình không đóng đầu tiên, và sau đó các chương trình đóng gần đây nhất tiếp theo.
Sự cố là, thứ tự không hoạt động trong các nhóm. Nó chỉ là chọn một trong các chương trình một cách ngẫu nhiên. Làm cách nào để giải quyết vấn đề này?
Chỉ cần đến với điều này:
SELECT *
FROM clients AS client
JOIN (SELECT * FROM programs AS program ORDER BY program.close_date=0 DESC, program.close_date DESC) AS program ON client.id=program.client_id
GROUP BY client.id
Mà dường như để cho kết quả chính xác. Điều này có đúng không, hoặc tôi có may mắn không? tức là, về cơ bản tôi đã sắp xếp bảng trước khi tham gia vào nó; những kết quả đó sẽ vẫn được sắp xếp khi nó tham gia, phải không?
Giải pháp: bây giờ tôi tin rằng đây là một vấn đề group-wise maximum cổ điển. Tìm kiếm điều đó nếu bạn đang mắc kẹt trên một vấn đề tương tự. Giải pháp liên quan đến việc tham gia cùng một bảng hai lần.
ORDER BY trong lựa chọn phụ không có ảnh hưởng đến kết quả xác định. Nó có thể xảy ra để làm việc với MySQL, nhưng tiêu chuẩn SQL thậm chí không cho phép nó. Điểm mấu chốt là để ORDER BY client.id trong chính (truy vấn bên ngoài), sau đó bởi bất kỳ cột nào khác mà bạn muốn. Bạn có thể phải nói những điều tương tự trong các mệnh đề GROUP BY và ORDER BY; nó không tốn bất cứ điều gì để làm như vậy. –
@Mark: Tôi không nghĩ rằng giải pháp thay thế của bạn (được đăng ở trên) được đảm bảo cung cấp kết quả chính xác. Sau khi một 'GROUP BY' được thực hiện trên' client.id', ["máy chủ được tự do lựa chọn bất kỳ bản ghi nào từ mỗi nhóm"] (http://dev.mysql.com/doc/refman/5.0/en/group -by-hidden-columns.html). – unutbu
@ubutbu: Cảm ơn! Đó chính là điều tôi muốn biết. Tôi đã lo lắng rằng có thể là trường hợp. – mpen