Đây là greatest-n-per-group
vấn đề được hỏi thường xuyên trên Stack Overflow.
Đây là cách tôi sẽ giải quyết nó trong trường hợp của bạn:
SELECT m.memberid, m.membername, m.gender, mp.phone, mh.loggedtime, mh.ipaddy
FROM tbl_members m
INNER JOIN tbl_members_phones mp ON m.defaultphoneid = mp.phoneid
INNER JOIN tbl_members_addresses ma ON m.defaultaddressid = ma.addressid
LEFT OUTER JOIN tbl_members_login_history mh ON m.memberid = mh.memberid
LEFT OUTER JOIN tbl_members_login_history mh2 ON m.memberid = mh2.memberid
AND mh.pk < mh2.pk
WHERE mh2.pk IS NULL;
Đó là, chúng tôi muốn mh
là hàng gần đây nhất trong tbl_member_login_history cho memberid đã cho. Vì vậy, chúng tôi tìm kiếm một hàng khác mh2
điều đó thậm chí còn gần đây hơn. Nếu không gần đây hơn mh
hàng được tìm thấy, sau đó là mh2.*
sẽ là NULL, vì vậy mh
phải là gần đây nhất.
Tôi giả sử bảng này có một cột khóa chính chứa các giá trị ngày càng tăng. Đối với ví dụ này, tôi giả sử tên cột là pk
.
Sử dụng LEFT OUTER JOIN cho cả hai tham chiếu đến bảng lịch sử đăng nhập có nghĩa là m
hàng sẽ được báo cáo ngay cả khi không có hàng phù hợp.