Saya memiliki users
meja dan payments
meja, untuk setiap pengguna, yang memiliki pembayaran, mungkin memiliki beberapa pembayaran terkait di payments
tabel. Saya ingin memilih semua pengguna yang memiliki pembayaran, tetapi hanya memilih pembayaran terakhir mereka. Saya mencoba SQL ini tetapi saya belum pernah mencoba pernyataan SQL bersarang sebelumnya, jadi saya ingin tahu apa yang saya lakukan salah. Hargai bantuannya
SELECT u.*
FROM users AS u
INNER JOIN (
SELECT p.*
FROM payments AS p
ORDER BY date DESC
LIMIT 1
)
ON p.user_id = u.id
WHERE u.package = 1
mysql
sql
select
inner-join
Wasim
sumber
sumber
Part 1 - Joins and Unions
. :) di-bookmark!Solusi ini lebih baik daripada jawaban yang diterima karena berfungsi dengan benar ketika ada beberapa pembayaran dengan pengguna dan tanggal yang sama.
sumber
Lihat sqlfiddle ini
sumber
limit 1
klausul hanya akan kembali 1 pengguna yang tidak apa yang ingin OP.date
kolom berbeda darimax(p.date)
. Jika Anda menambahkan lebih banyak kolom dalampayments
tabel (misalnyacost
), semua kolom itu tidak akan berasal dari baris yang diperlukansumber
Ada dua masalah dengan kueri Anda:
INNER JOIN (SELECT ...) AS p ON ...
.Dengan asumsi tidak ada ikatan untuk
payments.date
, coba:sumber
From payments as p Where p.user_id =@user_id
karena kueri tersebut melakukan grup dengan di seluruh tabel.@ Jawaban John Woo membantu saya memecahkan masalah serupa. Saya telah memperbaiki jawabannya dengan mengatur urutan yang benar juga. Ini berhasil untuk saya:
Saya tidak yakin seberapa efisien ini.
sumber
Ini akan membuatnya bekerja
sumber
Matei Mihai diberikan solusi yang sederhana dan efisien tetapi tidak akan berhasil sampai dimasukkan
MAX(date)
di bagian SELECT sehingga query ini akan menjadi:Dan urutan berdasarkan tidak akan membuat perbedaan dalam pengelompokan tetapi dapat mengurutkan hasil akhir yang diberikan oleh kelompok. Saya mencobanya dan berhasil untuk saya.
sumber
Jawaban saya langsung terinspirasi dari @valex sangat berguna, jika Anda membutuhkan beberapa kolom di klausa ORDER BY.
sumber
Anda bisa mencoba ini:
sumber