मुझे लगता है कि आपकी क्वेरी "सही" परिणाम दे रही है, जैसे कि आप कुछ वार्तालापों में अंतिम संदेश देखना चाहते हैं, आपको वास्तव में 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
) कॉलम के नाम या उपनाम के लिए, इससे बचने का प्रयास करें। या यदि आप उनका उपयोग करते हैं तो बैकटिक्स का उपयोग करें।