سؤال

أحاول إنشاء SQL لاسترداد قائمة بأحدث المشاركات لمؤشر المنتدى. لدي الكود التالي:

SELECT
 item_discuss_thread_id
 , item_discuss_post_title
 , COUNT(item_discuss_thread_id) AS nb_posts
FROM
 item_discuss_posts
GROUP BY
 item_discuss_thread_id

من الواضح أن هذا سوف يجمد دون احترام ما إذا كان المنشور الأحدث أم لا. item_discuss_post_title سوف تحصل فقط على الصف الأول في المجموعة.

أتساءل عما إذا كان هناك بعض الطريق حول هذا؟ إذا لم يكن الأمر كذلك، فما هي أفضل طريقة لحل المشكلة ... فقط السدود؟

شكرا، بافل

تحديث: يرجى ملاحظة أنني بحاجة إلى جميع المواضيع، الحد 1 لا يحل المشكلة. أيضا النظام من قبل ليس خيارا كجموعة من خلال تحديد السجل الأول من المجموعة على أي حال. هذا ليس سؤال بسيط لأنه يبدو أنه.

تحديث:

أريد حقا أن أحاول تجنب استخدام السدود أو إذا فعل ذلك - استخدمه الأمثل. ما جئت معه حاليا هو شيء مثل هذا:

SELECT
  ordered_by_date.item_discuss_thread_id
  , item_discuss_post_title
  , COUNT(item_discuss_thread_id) AS nb_posts
FROM
  (
   SELECT
     item_discuss_thread_id
     , item_discuss_post_title
   FROM
      item_discuss_posts
   ORDER BY
      item_discuss_post_datetime DESC
  ) AS ordered_by_date
GROUP BY
   item_discuss_thread_id

شرح تمديد يعطي النتيجة التالية:

id, select_type, table, type, possible_keys, key, key_len, ref, rows, Extra
1, PRIMARY, <derived2>, ALL, \N, \N, \N, \N, 20, Using temporary; Using filesort
2, DERIVED, item_discuss_posts, index, \N, item_discuss_post_datetime, 8, \N, 20, 
هل كانت مفيدة؟

المحلول

جرب هذا.

SELECT
  *
FROM
  (SELECT item_discuss_thread_id, item_discuss_post_title, COUNT(item_discuss_thread_id) AS nb_posts
   FROM item_discuss_posts
   ORDER BY __datecolumn__)
  AS ordered_by_date
GROUP BY
  ordered_by_date.item_discuss_thread_id

يستبدل __datecolumn__ مع العمود الذي يخزن وقت النشر.

نصائح أخرى

حسنا، لقد جئت مع حل نفسي. لقد استخدمت عملية استقبالية معتمدة لحلها. هذا هو ما لدي في النتيجة:

        SELECT
             item_discuss_threads.item_discuss_thread_id
             , item_discuss_threads.item_discuss_thread_datetime
             , item_discuss_threads.item_discuss_thread_title
             , latest_posts.item_discuss_post_title
             , latest_posts.item_discuss_post_datetime
             , COUNT(item_discuss_posts.item_discuss_post_id) AS nb_posts
        FROM
             item_discuss_threads
        INNER JOIN item_discuss_posts
             ON item_discuss_threads.item_discuss_thread_id=item_discuss_posts.item_discuss_thread_id
        INNER JOIN item_discuss_posts AS latest_posts
             ON latest_posts.item_discuss_thread_id=item_discuss_threads.item_discuss_thread_id
        WHERE
             (
                  SELECT
                        item_discuss_post_id
                  FROM
                        item_discuss_posts AS p
                  WHERE
                        p.item_discuss_thread_id=item_discuss_posts.item_discuss_thread_id
                  ORDER BY
                        item_discuss_post_datetime DESC
                  LIMIT
                       1
             )=latest_posts.item_discuss_post_id
        GROUP BY
             item_discuss_threads.item_discuss_thread_id
        ORDER BY
            latest_posts.item_discuss_post_datetime DESC
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top