मुझे लगता है कि आपकी क्वेरी "सही" परिणाम दे रही है, जैसे कि आप कुछ वार्तालापों में अंतिम संदेश देखना चाहते हैं, आपको वास्तव में conversation_id के आधार पर समूह बनाना चाहिए . हालांकि मुझे यह फ़ील्ड आपको स्कीमा में नहीं दिख रही है।
अगर आप WHERE sender_id = 3 GROUP BY receiver_id करते हैं , तो यह सही है, कि क्वेरी आपको संदेश 1 और 7 लौटाती है, 'क्योंकि वे संदेश भिन्न को भेजे गए थे लोग, इस प्रकार आपके डिज़ाइन में वे अलग-अलग वार्तालाप हैं।
यदि आप सामान्य रूप से आपके द्वारा भेजे गए अंतिम संदेश को ही देखना चाहते हैं, तो बस GROUP BY हटा दें आपके UNION . के दूसरे भाग में . अन्यथा, अपने स्कीमा को फिर से डिज़ाइन करने पर विचार करें।
संपादित करें:
इस क्वेरी को आजमाएं:
SELECT m.message_id, u.username, m.subject, m.message,
m.status, UNIX_TIMESTAMP(m.date) as `date`
FROM users u
LEFT JOIN messages m ON m.sender_id = u.id
WHERE m.message_id IN (
SELECT max(message_id)
FROM messages
WHERE receiver_id = 3 OR sender_id = 3
GROUP BY least(sender_id,receiver_id),
greatest(sender_id,receiver_id)
);
कुछ नोट:
UNIONअब इसकी आवश्यकता नहीं है;- यह दृष्टिकोण 2 पक्षों के बीच सभी ई-मेल को एक ही वार्तालाप के रूप में मानेगा, जो हमेशा सत्य नहीं होता है। हो सकता है कि आप इस दृष्टिकोण को फिर से डिज़ाइन करना चाहें;
- आरक्षित शब्दों का उपयोग करना एक खराब शैली है (जैसे
date) कॉलम के नाम या उपनाम के लिए, इससे बचने का प्रयास करें। या यदि आप उनका उपयोग करते हैं तो बैकटिक्स का उपयोग करें।