सबसे पहले, कृपया क्षमा करें कि मैंने तालिका के नामों को थोड़ा बदलकर message
कर दिया है और message_tag
पठनीयता के लिए।
दूसरा, मैंने इसका परीक्षण नहीं किया। इसे एक निश्चित उत्तर के बजाय एक सूचक के रूप में प्रयोग करें।
क्वेरी दो उपश्रेणियों का उपयोग करती है, जो इतनी कुशल नहीं हो सकती हैं, शायद सुधार की गुंजाइश है। सबसे पहले, अंतरतम क्वेरी वर्तमान संदेश के टैग की तलाश करती है। फिर, मध्य क्वेरी उन संदेशों की तलाश करती है जो कम से कम एक सामान्य टैग के साथ चिह्नित हैं। समूहीकरण का उपयोग अद्वितीय संदेश_आईडी प्राप्त करने और उन्हें सामान्य टैगों की संख्या के आधार पर करने के लिए किया जाता है। अंत में, 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 < ?