Pertama-tama, mohon maaf saya mengubah nama tabel sedikit menjadi message
dan message_tag
untuk keterbacaan.
Kedua, saya tidak menguji ini. Gunakan itu sebagai petunjuk daripada jawaban yang pasti.
Kueri menggunakan dua subkueri, yang mungkin tidak begitu efisien, mungkin ada ruang untuk perbaikan. Pertama, kueri terdalam mencari tag dari pesan saat ini. Kemudian, kueri tengah mencari pesan yang ditandai dengan setidaknya satu tag umum. Pengelompokan digunakan untuk mendapatkan message_id unik dan mengurutkannya berdasarkan jumlah tag umum. Terakhir, JOIN
digunakan untuk memuat detail tambahan dan untuk menyaring pesan lama.
Anda mungkin memperhatikan saya menggunakan tanda tanya alih-alih '$xyz'
. Ini untuk menghindari kekhawatiran tentang keluarnya konten variabel.
SELECT message_id, title, date
FROM message
RIGHT JOIN (SELECT message_id, COUNT(*)
FROM message_tag
WHERE tag_id IN
(SELECT MT.tag_id FROM message_tag MT WHERE MT.message_id = ?)
GROUP BY message_id
ORDER BY COUNT(*) DESC) RELATED_MESSAGES
ON message.message_id = RELATED_MESSAGES.message_id
WHERE date < ?