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.