Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Nối các bảng dựa trên giá trị lớn nhất

Trả lời câu hỏi ĐÃ CHỈNH SỬA (tức là cũng nhận được các cột được liên kết).

Trong Sql Server 2005+, cách tốt nhất sẽ là sử dụng xếp hạng / cửa sổ chức năng kết hợp với CTE , như thế này:

with exam_data as
(
    select  r.student_id, r.score, r.date,
            row_number() over(partition by r.student_id order by r.score desc) as rn
    from    exam_results r
)
select  s.name, d.score, d.date, d.student_id
from    students s
join    exam_data d
on      s.id = d.student_id
where   d.rn = 1;

Đối với giải pháp tuân thủ ANSI-SQL, một truy vấn con và tự nối sẽ hoạt động, như sau:

select  s.name, r.student_id, r.score, r.date
from    (
            select  r.student_id, max(r.score) as max_score
            from    exam_results r
            group by r.student_id
        ) d
join    exam_results r
on      r.student_id = d.student_id
and     r.score = d.max_score
join    students s
on      s.id = r.student_id;

Điều cuối cùng này giả định rằng không có kết hợp student_id / max_score trùng lặp, nếu có và / hoặc bạn muốn lập kế hoạch loại bỏ trùng lặp chúng, bạn sẽ cần sử dụng một truy vấn con khác để kết hợp với một cái gì đó xác định để quyết định bản ghi nào sẽ kéo . Ví dụ:giả sử bạn không thể có nhiều hồ sơ cho một học sinh nhất định với cùng một ngày, nếu bạn muốn vượt qua mối quan hệ dựa trên điểm max_score gần đây nhất, bạn sẽ làm như sau:

select  s.name, r3.student_id, r3.score, r3.date, r3.other_column_a, ...
from    (
            select  r2.student_id, r2.score as max_score, max(r2.date) as max_score_max_date
            from    (
                        select  r1.student_id, max(r1.score) as max_score
                        from    exam_results r1
                        group by r1.student_id
                    ) d
            join    exam_results r2
            on      r2.student_id = d.student_id
            and     r2.score = d.max_score
            group by r2.student_id, r2.score
        ) r
join    exam_results r3
on      r3.student_id = r.student_id
and     r3.score = r.max_score
and     r3.date = r.max_score_max_date
join    students s
on      s.id = r3.student_id;

CHỈNH SỬA:Đã thêm truy vấn khử trùng lặp thích hợp nhờ Mark nắm bắt tốt các nhận xét



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để bạn dừng MySQL khi cài đặt Mac OS?

  2. Trường tính toán-toán học CakePHP?

  3. Cấu trúc dữ liệu cho các loại giải đấu / cạnh tranh khác nhau (giải đấu, thang, loại trực tiếp đơn / đôi, v.v.)

  4. Tạo thẻ html tùy chỉnh cho CMS?

  5. Làm thế nào để lặp qua đối tượng Yii CActiveDataProvider?