سؤال

لدي حاليًا الجداول التالية لمنتدى المراسلة الخاص:

نص بديل http://img159.imageshack.us/img159/45/pmdata.jpg

نص بديل http://img504.yfrog.com/img504/3968/pminfo.jpg

ما أحاول القيام به هو إخراج "صندوق بريد" يعرض أحدث سلسلة محادثات في الأعلى ويتم تجميعها حسب سلسلة المحادثات (بمعنى أنك لا ترى نفس سلسلة المحادثات مرتين في صندوق الوارد الخاص بك)، بغض النظر عمن هو المرسل.

ما لدي الآن يعمل بشكل جيد مع الرسائل البسيطة بين مستخدمين.ومع ذلك، بمجرد قيام مستخدم ثالث بالرد على نفس الموضوع، فإنه لا يتم عرضه بشكل صحيح.استعلامي الحالي هو هذا:

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
INNER JOIN (SELECT thread_id, sender_id, MAX(date_sent) AS thread_max_date_sent FROM pm_data GROUP BY thread_id, sender_id) deriv1 ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent AND pm_data.sender_id = deriv1.sender_id
WHERE pm_info.receiver_id = '$usrID'
ORDER BY deriv1.thread_max_date_sent DESC

بافتراض أن $usrID = 68 (وبالتالي، معرف_الاستقبال = 68)، فإنه ينتج هذا:

From: Kyle (pm_data.id = 18) RE: single message (thread_id= 13587)
From: Ed (pm_data.id = 12)   RE: single message (thread_id= 13587)
From: Ed (pm_data.id = 8)    RE: Test Number 2 (thread_id= 16256)

لاحظ كيف يظهر thread_id (13587) مرتين نظرًا لوجود مرسلين مختلفين.

كيف يمكن أن أحصل عليه فقط عرض أحدث thread_id، بغض النظر عمن هو المرسل؟

تشكرات!!

هل كانت مفيدة؟

المحلول

يبدو في الواقع أن الاستعلام الموجود في السؤال الأصلي لا يتطلب سوى تغيير بسيط جدًا للحصول على أحدث سجل فعلي لكل سلسلة رسائل.

  1. قم بإسقاط sender_id في حقول GROUP BY الخاصة بالاستعلام الفرعي
  2. ارمي pm_data.sender_id = deriv1.sender_id في جملة ON
SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid, thread_max_date_sent
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
INNER JOIN (SELECT thread_id, /*sender_id,*/ MAX(date_sent) AS thread_max_date_sent 
                FROM pm_data GROUP BY thread_id /*, sender_id*/) deriv1 
    ON pm_data.thread_id = deriv1.thread_id AND pm_data.date_sent = deriv1.thread_max_date_sent /*AND pm_data.sender_id = deriv1.sender_id*/
WHERE pm_info.receiver_id = '$usrID'
ORDER BY deriv1.thread_max_date_sent DESC

كملاحظة جانبية:إن أمكن، ابحث عن الحد الأقصى لمعرف الرسالة في هذا الاستعلام الفرعي بدلاً من الحد الأقصى (date_sent)

نصائح أخرى

وحاول

SELECT pm_info.is_read, sender.usrFirst as sender_name, pm_data.date_sent,  pm_data.title, pm_data.thread_id, pm_data.id as dataid
FROM pm_data, pm_info, tblUsers as sender 
WHERE pm_info.message_id = pm_data.id 
  AND pm_data.sender_id = sender.usrID
  AND pm_info.receiver_id = '$usrID'
GROUP BY thread_id
ORDER BY date_sent DESC
LIMIT 0,1

وحاول

SELECT pm_info.is_read, group_concat(DISTINCT sender.usrFirst) as sender_name,
    pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as dataid,
    MAX(date_sent) AS thread_max_date_sent
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS sender ON pm_data.sender_id = sender.usrID
WHERE pm_info.receiver_id = '$usrID'
GROUP BY pm_data.thread_id
ORDER BY thread_max_date_sent DESC;

لا تتردد في نختلف مع جزء group_concat، إذا كان لا يلبي احتياجاتك. انها مجرد يسرد كافة المرسلين ذات الصلة بدلا من اختيار واحد بشكل تعسفي.

واقتراحي سيكون لتقسيم قاعدة البيانات الخاصة بك إلى جدولين لتحسين التطبيع: "موضوع" و "الرسالة". هناك معلومات موضوع من شأنها أن تكون مشتركة بين جميع الرسائل، مثل عنوان الموضوع. كنت إضاعة الفضاء في الجدول رسالة بتكرار نفس القيم.

هل يمكن أن يكون "آخر مرة الأخيرة" حقل الجدول الموضوع، والتي يتم تحديثها على كل وظيفة جديدة. ثم انها فقط مسألة بسيطة اختيار من الجدول موضوع وترتيب من قبل آخر مشاركة. سيكون أسرع كثيرا جدا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top