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

Nối một hàng từ một bảng trong MySQL

Đây là vấn đề lớn nhất-n-per-group thường xuyên xuất hiện trên Stack Overflow.

Đây là câu trả lời thông thường của tôi:

select
  p.name        player,
  s.date        first_score,
  s.points      points

from  players p

join  scores  s
  on  s.player_id = p.id

left outer join scores  s2
  on  s2.player_id = p.id
      and s2.date < s.date

where
  s2.player_id is null

;

Nói cách khác, đã cho điểm s, hãy cố gắng tìm điểm s2 cho cùng một người chơi, nhưng với một ngày sớm hơn. Nếu không tìm thấy điểm sớm hơn thì s là điểm sớm nhất.

Nhận xét của bạn về cà vạt:Bạn phải có một chính sách để sử dụng cái nào trong trường hợp cà vạt. Một khả năng là nếu bạn sử dụng khóa chính tự động tăng, khóa có giá trị nhỏ nhất là khóa sớm hơn. Xem thuật ngữ bổ sung trong phần nối bên ngoài bên dưới:

select
  p.name        player,
  s.date        first_score,
  s.points      points

from  players p

join  scores  s
  on  s.player_id = p.id

left outer join scores  s2
  on  s2.player_id = p.id
      and (s2.date < s.date or s2.date = s.date and s2.id < s.id)

where
  s2.player_id is null

;

Về cơ bản, bạn cần thêm các điều khoản tiebreaker cho đến khi bạn nhận được một cột được đảm bảo là duy nhất, ít nhất là đối với người chơi nhất định. Khóa chính của bảng thường là giải pháp tốt nhất, nhưng tôi đã gặp trường hợp cột khác phù hợp.

Về các nhận xét mà tôi đã chia sẻ với @OMG Ponies, hãy nhớ rằng loại truy vấn này có lợi rất nhiều từ chỉ mục phù hợp.



  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 thế nào để sử dụng Enums trong Scala Slick?

  2. Tôi có thể tự động điều chỉnh giá trị của trường tăng dần trong cơ sở dữ liệu không?

  3. Mối quan hệ một-nhiều trong MySQL - làm thế nào để xây dựng mô hình?

  4. Sử dụng truy vấn thô Laravel với trình giữ chỗ

  5. Có bất kỳ mức tăng hiệu suất nào trong việc lập chỉ mục một trường boolean không?