Ini tidak berfungsi sebagaimana mestinya dan dokumentasi menjelaskan arti dari DISTINCT
:ini tentang baris yang berbeda :
(sumber:http://dev.mysql.com /doc/refman/5.7/en/select.html )
Anda perlu mengelompokkan baris berdasarkan pengguna untuk mendapatkan satu baris untuk setiap pengguna, tetapi sayangnya, Anda tidak dapat memperoleh skor terbaru mereka dengan cara ini. Anda bisa mendapatkan skor maksimum, minimum, rata-rata, dan nilai komputasi lainnya. Periksa daftar GROUP BY
fungsi agregat
.
Kueri
Ini adalah kueri yang mendapatkan nilai yang Anda butuhkan:
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
Cara kerjanya
Ini bergabung dengan tabel users
(alias sebagai u
) dengan tabel attempts
(alias sebagai la
, kependekan dari "percobaan terakhir") menggunakan emailaddress
sebagai kolom yang cocok. Ini adalah gabungan yang sudah Anda miliki dalam kueri Anda, saya menambahkan alias karena mereka membantu Anda menulis lebih sedikit sejak saat itu.
Selanjutnya, ia bergabung dengan attempts
tabel lagi (alias sebagai mr
dari "lebih baru daripada upaya terakhir"). Ini cocok dengan setiap upaya dari la
dengan semua upaya dari mr
dari pengguna yang sama (diidentifikasi dengan emailaddress
) dan yang memiliki datetime
yang lebih baru . LEFT JOIN
memastikan bahwa setiap baris dari la
cocok dengan setidaknya satu baris dari mr
. Baris dari la
yang tidak memiliki kecocokan di mr
adalah baris yang memiliki nilai datetime
biggest terbesar untuk setiap emailaddress
. Mereka dicocokkan dengan baris yang penuh dengan NULL
(untuk mr
bagian).
Terakhir, WHERE
klausa hanya menyimpan baris yang memiliki NULL
di datetime
kolom dari baris yang dipilih dari mr
. Ini adalah baris yang cocok dengan entri terbaru dari la
untuk setiap nilai emailaddress
.
Komentar kinerja
Untuk menjalankan kueri ini dengan cepat (kueri apa pun! ) membutuhkan indeks pada kolom yang digunakan dalam JOIN
, WHERE
, GROUP BY
dan ORDER BY
klausa.
Anda tidak boleh menggunakan emailaddress
dalam tabel attempts
untuk mengidentifikasi pengguna. Anda harus memiliki PK
(kunci utama) pada tabel users
dan gunakan itu sebagai FK
(kunci asing) di tabel attempts
(dan tabel lain yang merujuk ke pengguna). Jika emailaddress
adalah PK
tabel users
ubah ke UNIQUE INDEX
dan gunakan INTEGER AUTO INCREMENT
baru ed kolom userId
sebagai PK
alih-alih. Indeks pada kolom numerik lebih cepat dan menggunakan lebih sedikit ruang daripada indeks pada kolom string.