Câu hỏi đặt ra là tại sao bạn cần "truy vấn lồng nhau"? Chúng tôi không cần phải sử dụng "truy vấn lồng nhau" này là suy nghĩ trong suy nghĩ của SQL không quan hệ đại số. Với đại số quan hệ chúng ta lấy được các mối quan hệ và sử dụng kết quả của một mối quan hệ như đầu vào khác nên sau đây sẽ giữ đúng:
points = Table(:points, {:as => 'sorted'}) # rename in the options hash
final_points = points.order('timestamp DESC').group(:client_id, :timestamp).project(:client_id, :timestamp)
Tốt nhất là nếu chúng ta rời khỏi đổi tên để Arel, trừ khi thật cần thiết.
Tại đây phép chiếu của client_id VÀ dấu thời gian là rất quan trọng vì chúng tôi không thể chiếu tất cả các tên miền từ quan hệ (tức là được sắp xếp. *). Bạn phải cụ thể dự án tất cả các tên miền sẽ được sử dụng trong hoạt động nhóm cho mối quan hệ. Lý do là không có giá trị cho * đó sẽ là đại diện rõ ràng của một client_id được nhóm lại. Ví dụ nói rằng bạn có bảng sau
client_id | score
----------------------
4 | 27
3 | 35
2 | 22
4 | 69
đây nếu bạn nhóm bạn không thể thực hiện một dự báo về lĩnh vực điểm vì giá trị có thể thể là 27 hoặc 69 nhưng bạn có thể chiếu một sum (điểm)
Bạn chỉ có thể dự án các thuộc tính miền có các giá trị duy nhất cho nhóm (thường là các hàm tổng hợp như sum, max, min). Với truy vấn của bạn, nó sẽ không quan trọng nếu các điểm được sắp xếp theo dấu thời gian vì cuối cùng chúng sẽ được nhóm theo client_id. thứ tự dấu thời gian không liên quan vì không có dấu thời gian duy nhất có thể đại diện cho một nhóm.
Vui lòng cho tôi biết cách tôi có thể giúp bạn với Arel. Ngoài ra, tôi đã làm việc trên một chuỗi học tập để mọi người sử dụng Arel ở cốt lõi của nó. Đầu tiên của bộ truyện là http://Innovative-Studios.com/#pilot Tôi có thể nói rằng bạn đang bắt đầu biết làm thế nào kể từ khi bạn sử dụng Bảng (: điểm) thay vì Điểm mô hình ActiveRecord.
Cảm ơn bạn đã trả lời chi tiết. "thứ tự dấu thời gian không liên quan vì không có dấu thời gian duy nhất có thể đại diện cho một nhóm". Bạn đúng; Tôi thấy những gì bạn đang nói. Nó xuất hiện MySQL hoạt động xung quanh sự không thống nhất này bằng cách trả về hàng đầu tiên của nhóm client_id, đó là những gì tôi đang nhắm tới. Tôi thấy bây giờ đây không phải là hành vi tôi nên dựa vào. Mục tiêu của tôi là trả lại điểm gần đây nhất cho tất cả các client_ids, nghĩa là một điểm duy nhất có dấu thời gian tối đa cho mỗi nhóm khách hàng. Điều quan trọng là phải làm trong một truy vấn bởi vì nó sẽ được thăm dò thường xuyên. – Schrockwell
Chúng tôi sẽ cần sử dụng một số chức năng tổng hợp. Nếu chúng ta tự hỏi "Chúng ta đang cố gắng làm gì?" Câu trả lời sẽ là tìm ngày gần đây nhất hoặc "tối đa" để chúng tôi vượt qua tối đa (dấu thời gian) trong sql. Điều này sẽ tương ứng với Arel :: Attribute :: Expression :: Maximum có thể được gọi với cú pháp đường trên Arel :: Attribute như được sắp xếp [: timestamp] .maximum(). Có một báo trước. Đảm bảo rằng bạn thêm dấu thời gian vào nhóm hoạt động #group ('client_id, dấu thời gian') hoặc toàn bộ kịch bản nhóm sẽ bị lỗi. Tôi biết hàm tổng hợp MAX hoạt động vào các ngày trong Postgres và tôi cũng chắc chắn trong MySQL. – Snuggs
Thứ nhất, sắp xếp và sắp xếp không phải là một phần của đại số quan hệ. Arel định nghĩa nó. Thứ hai, có hay không truy vấn phụ là một phần của đại số quan hệ là không liên quan. Về mặt khái niệm, kết quả của một lệnh SELECT không hiển thị cho đến khi mệnh đề WHERE thực thi. Do đó không phải tất cả các cơ sở dữ liệu (ví dụ Postgres) cho phép các bí danh cột trong mệnh đề WHERE và thay vào đó phụ thuộc vào các truy vấn phụ. Nếu Arel không thể xử lý các truy vấn con thì các tên trong mệnh đề WHERE không thể được đặt bí danh. Điều này có thể lộn xộn khi bạn không thể phụ thuộc vào Arel để tạo ra tên. –