まず、テーブル名をmessage
に少し変更したことをお詫び申し上げます。 およびmessage_tag
読みやすさのために。
第二に、私はこれをテストしませんでした。明確な答えではなく、ポインタとして使用してください。
クエリは2つのサブクエリを使用しますが、これはそれほど効率的ではない可能性があり、おそらく改善の余地があります。まず、最も内側のクエリが現在のメッセージのタグを探します。次に、中央のクエリは、少なくとも1つの共通タグでマークされたメッセージを探します。グループ化は、一意のmessage_idを取得し、それらを共通タグの数で並べ替えるために使用されます。最後に、JOIN
追加の詳細をロードし、古いメッセージを除外するために使用されます。
'$xyz'
の代わりに疑問符を使用したことに気付くかもしれません 。これは、変数の内容をエスケープする必要がないようにするためです。
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 < ?