Nó không hoạt động như bạn nghĩ và tài liệu giải thích ý nghĩa của DISTINCT
:đó là về hàng riêng biệt :
(nguồn: http://dev.mysql.com /doc/refman/5.7/en/select.html )
Bạn cần phải nhóm các hàng theo người dùng để có được một hàng cho mỗi người dùng nhưng rất tiếc, bạn không thể lấy điểm gần đây nhất của họ theo cách này. Kiểm tra danh sách GROUP BY tổng hợp các chức năng
.
Truy vấn
Đây là truy vấn nhận các giá trị bạn cần:
SELECT u.fsname, u.emailaddress, la.score
FROM users u
INNER JOIN attempts la # 'la' from 'last attempt'
ON u.emailaddress = la.emailaddress
LEFT JOIN attempts mr # 'mr' from 'more recent' (than last attempt)
ON la.emailaddress = mr.emailaddress AND la.datetime < mr.datetime
WHERE mr.datetime IS NULL
Cách hoạt động
Nó tham gia bảng người dùng
(bí danh là u
) với lần thử
(bí danh là la
, viết tắt của "nỗ lực cuối cùng") bằng cách sử dụng emailaddress
làm cột đối sánh. Đó là phép nối bạn đã có trong truy vấn của mình, tôi đã thêm các bí danh vì chúng giúp bạn viết ít hơn kể từ thời điểm đó.
Tiếp theo, nó tham gia các lần thử
bảng lại (bí danh là mr
từ " gần đây hơn so với lần thử cuối cùng "). Nó khớp với mỗi lần thử từ la
với tất cả các nỗ lực từ mr
của cùng một người dùng (được xác định bởi địa chỉ email
của họ ) và có datetime
gần đây hơn . THAM GIA TRÁI
đảm bảo rằng mỗi hàng từ la
khớp với ít nhất một hàng từ mr
. Các hàng từ la
không khớp trong mr
là các hàng có giá trị lớn nhất của datetime
cho mỗi địa chỉ email
. Chúng được khớp với các hàng đầy NULL
(cho mr
phần).
Cuối cùng, WHERE
mệnh đề chỉ giữ các hàng có NULL
trong datetime
cột của hàng được chọn từ mr
. Đây là các hàng khớp với các mục nhập gần đây nhất từ la
cho mỗi giá trị của emailaddress
.
Nhận xét về hiệu suất
Để chạy nhanh truy vấn này ( bất kỳ truy vấn nào! ) cần chỉ mục trên các cột được sử dụng trong JOIN
, WHERE
, GROUP BY
và ĐẶT HÀNG THEO
mệnh đề.
Bạn không nên sử dụng emailaddress
trong bảng lần thử
để xác định người dùng. Bạn phải có PK
(khóa chính) trên người dùng
và sử dụng nó như một FK
(khóa ngoại) trong lần thử
(và các bảng khác tham chiếu đến một người dùng). Nếu emailaddress
là PK
trong bảng người dùng
thay đổi nó thành một CHỈ SỐ DUY NHẤT
và sử dụng INTEGER AUTO INCREMENT
mới cột ed userId
dưới dạng PK
thay vì. Chỉ mục trên cột số nhanh hơn và sử dụng ít không gian hơn chỉ mục trên cột chuỗi.