Ini adalah greatest-n-per-group
masalah, yang sering ditanyakan di Stack Overflow.
Inilah cara saya menyelesaikannya dalam skenario Anda:
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;
Artinya, kami ingin mh
menjadi baris terbaru di tbl_member_login_history untuk yang diberikan. Jadi kami mencari baris lain mh2
yang bahkan lebih baru. Jika tidak ada yang lebih baru dari mh
baris ditemukan, lalu mh2.*
akan menjadi NULL, jadi mh
harus yang terbaru.
Saya berasumsi tabel ini memiliki kolom kunci utama yang berisi nilai yang meningkat. Untuk contoh ini, saya asumsikan nama kolomnya adalah pk
.
Menggunakan LEFT OUTER JOIN untuk keduanya referensi ke tabel riwayat login berarti bahwa m
baris akan dilaporkan meskipun tidak ada baris yang cocok.