Saya punya pertanyaan ini ( SQLFiddle ):
SELECT
c.name,
a.user_id,
a.status_id,
a.title,
a.rtime,
u.user_name,
s.status_name
FROM company c
LEFT JOIN action a ON a.company_id=c.id
LEFT JOIN user u ON u.id=a.user_id
LEFT JOIN status s ON s.id=a.status_id
WHERE u.user_name='Morgan'
-- WHERE c.name='Fiddle'
GROUP BY c.id
HAVING a.rtime IS NULL OR a.rtime = (
SELECT max(rtime)
FROM action a2
WHERE deleted IS NULL
AND a2.company_id = c.id
)
Masalah 1
Saya ingin mendaftar semua perusahaan, dan menunjukkan kepada pengguna dan status di mana mereka terakhir melakukan tindakan pada perusahaan. Pada saat yang sama tunjukkan kepada perusahaan di mana tidak ada tindakan telah dilakukan.
Masalah 2
Saya juga harus dapat mencari pengguna dengan nama, sehingga memilih semua perusahaan jika pengguna ini memiliki aktivitas terakhir. Kueri dibuat dari formulir, jadi saya bisa menyuntikkan variabel.
Saya tidak dapat mengubah database SCHEMA saat ini, tetapi saran untuk migrasi di masa mendatang jauh lebih disukai.
Saya sudah mencoba mengikatnya INNER JOIN ( SELECT.. ) t ON
tetapi saya tidak bisa mengatasinya.
Saya juga sudah mencoba metode dari sini , di sini , dan di sini, tetapi saya tidak dapat membuat orang tersebut melakukan aktivitas terbaru dengan benar.
Versi MySQL: 5.5.16. Tabel perusahaan memiliki sekitar 1 baris baris, dan tabel aksi berada pada 70K, tumbuh. Kinerja penting bagi saya di sini.
Bagaimana ini bisa diselesaikan?
MAX(Marks)
perTaskID
, Anda inginMAX(ActivityDate)
perCompany
.) Tidak ada banyak perbedaan jika Anda memiliki satu tabel atau bergabung.Jawaban:
Permintaan Anda dapat disederhanakan menjadi:
Indeks pada
(deleted, company_id, rtime)
akan membuat subquery tabel turunan efisien. Saya kira Anda sudah memiliki indeks pada kolom yang digunakan untuk bergabung danCompany (name)
.SQL-Fiddle
sumber
Setelah mencoba jawaban yang berbeda, saya membuatnya berfungsi, tetapi saya merasa lambat dalam pengaturan saya.
ypercube menunjuk saya ke jawaban yang menunjuk ke pertanyaan serupa lainnya tentang bagaimana MySQL mengelompokkan hasil. Ini membawa saya ke sumber daya ini di mana saya akhirnya mengerti apa yang sedang terjadi.
Hasilnya berupa kueri seperti ini:
Berikut biola dengan kueri yang berfungsi
sumber
Anda perlu memindahkan tabel pengguna, tindakan, dan status ke dalam sub-kueri, seperti ini:
SQL Fiddle
sumber