سؤال

أواجه مشكلة في تشكيل استعلام MySQL يقوم بإجراء الإجراء التالي:

حدد كافة Threadids من جدول المواضيع التي ترتيبها بواسطة الطابع الزمني (في ترتيب تنازلي) لأحدث مشاركة (أكبر طابع زمني) مع ترسيم يساوي therceid من كل مؤشر ترابط. لذلك أريد أن أذهب من خلال المواضيع والتحقق من MySQL قاعدة البيانات الخاصة بقوله لنقول الموضوع 0. ثم يتحقق من جميع المشاركات التي تحتوي على TrissID من 0 و Transs Thread0 بناء على أكبر طابع زمني للوظائف داخل ThereS0. ثم يكرر هذا للحصول على الموضوع 1، الموضوع 2، إلخ وفرزها وفقا لذلك.

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

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

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

المحلول

وقد عملت ما يلي بالنسبة لي في الماضي في MYSQL. إذا كنت ترغب في تضمين المزيد حول كل مؤشر ترابط في الاستعلام، فسيتعين عليك إضافة الأعمدة إلى SELECT و ال GROUP BY.

select thread.threadID, max(comments.modifiedOn) as threadUpdated 
   from thread inner join comments on thread.threadID = comments.threadID 
   group by 1 
   order by 2 desc;

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

نصائح أخرى

SELECT  *
FROM    threads t
LEFT JOIN
        posts p
ON      p.id =
        (
        SELECT  p.id
        FROM    posts pi
        WHERE   pi.threadID = t.threadID
        ORDER BY
                pi.timestamp DESC
        LIMIT 1
        )

وجود مؤشر على posts (threadID, timestamp) سوف يحسن هذا الاستعلام إلى حد كبير.

لاحظ أنه على عكس GROUP BY الحلول، يحدد هذا الاستعلام أيضا جميع الحقول من posts ويعمل حتى لو كان لديك تكرارات على الأحدث posts.timestamp.

SELECT t.*, p1.`timestamp`
FROM threads t 
  JOIN posts p1 ON (p1.threadid = t.id)
  LEFT JOIN posts p2 ON (p2.threadid = t.id 
    AND p1.`timestamp` < p2.`timestamp`)
WHERE p2.threadid IS NULL
ORDER BY p1.`timestamp` DESC;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top