MySQL - كيفية إظهار آخر موضوع لكل موضوع
سؤال
أحاول إنشاء 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