1

フォーラム スレッドの最新の投稿のリストを取得するための 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グループの最初の行だけを取得します。

これを回避する方法があるのだろうか?そうでない場合、問題を解決する最善の方法は何ですか...サブクエリのみですか?

ありがとう、パベル

更新: すべてのスレッドが必要であることに注意してください。LIMIT 1 は問題を解決していません。また、GROUP BY はグループから最初のレコードを選択するため、ORDER BY はオプションではありません。これは、見かけほど単純な質問ではありません。

アップデート:

私は本当にサブクエリの使用を避けたいと思っています。そうする場合は、最適な方法で使用してください。私が現在持っているものは次のようなものです:

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

EXPLAIN EXTENDED の結果は次のとおりです。

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, 
4

2 に答える 2

2

わかりました、私は自分で解決策を持ってきました。依存サブクエリを使用して解決しました。これは私が結果に持っているものです:

        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
于 2009-12-09T23:22:17.090 に答える
1

これを試して。

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__投稿時間を格納する列に置き換えます。

于 2009-12-08T20:44:00.183 に答える