0

そのようなタイプのクエリで私を助けることができますか。

私は持っている:

  • postsテーブル
  • commentsテーブル

それらはcomments.post_id = posts.post_id列を介してリンクされています。

ユーザーは、過去のコメントで投稿をフィルタリングできます。

  • 1時間
  • 24時間
  • 2日など

ユーザーが過去 1 時間の投稿を表示することを選択したが、この期間に投稿がない場合は、段階的に進む必要があります。

1 hour過去、空の場合 - 過去24 hours、空の場合 - 過去2 days、空の場合 - 創業以来 (条件なし)の投稿を選択します。

そのようなクエリを作成するのを手伝ってくれる人はいますか?

UPD

「コメントで投稿をフィルター」とは、コメント数で並べ替えることを意味します。

つまり、実際の目標は、「過去 XXX 時間に残されたコメント数で並べ替えられた投稿を表示する」という要求です。

また、「過去 1 時間」が選択されているが、過去 1 時間にコメントが残っている投稿がない場合は、過去 24 時間にコメントが残っている投稿 (コメント数でソート) を取得する必要があります。

テーブル構造

投稿:

  • post_id
  • 題名
  • コンテンツ
  • date_added

コメント

  • comment_id
  • コンテンツ
  • post_id
  • date_added

リンクはposts.post_id = comments.post_id.

ユーザーが過去 1 時間に最も多くコメントされた投稿を表示したときに、次の結果を得たいと考えています。

 posts.post_id | comments_count | posts.date_added | group
---------------+----------------+------------------+----------------
           156 |              8 |       2013-04-02 | hour
           154 |              3 |       2013-04-02 | hour
           129 |              1 |       2013-03-10 | 24 hours
           13  |             14 |       2013-02-18 | 48 hours
           138 |              6 |       2013-03-29 | week
           137 |              4 |       2013-03-29 | week
           161 |             21 |       2013-04-11 | month
           6   |              2 |       2013-01-24 | year
           103 |              8 |       2013-03-02 | since inception

結果の並べ替え:

  1. リストの一番上は、過去 1 時間以内にコメントされた 2 件の投稿で、コメント数で並べ替えられています。
  2. 次に、前日にコメントされた投稿を配置します。
  3. 次 — 過去 2 日間の期限がコメントされた投稿
  4. コメントされた投稿の期限は過去 1 週間です。ここでも、コメント数の順に並べる必要があります
  5. 過去 1 か月間
  6. 過去 1 年間
  7. このリストの最後には、1 年以上前にコメントされた記事を配置する必要があり、コメント数の順に並べる必要もあります。

前もって感謝します。

4

2 に答える 2

1

各グループの最新のコメントを計算します。次に、これを使用して、必要なグループを選択します。サブクエリを使用してこの計算を行うことができます。

select p.* c.*
from posts p join
     comments c
     on p.post_id = posts.post_id join
     (select post_id, max(postdate) as postdate
      from comments
      group by post_id
     ) cmax
     on cmax.post_id = p.post_id
where (case when timestampdiff(minute, now(), cmax.timestamp) <= 60
            then timestampdiff(minute, now(), c.timestamp) <= 60
            when  timestampdiff(minute, now(), cmax.timestamp) <= 60*24
            then timestampdiff(minute, now(), c.timestamp) <= 60*24
            . . .
      )

時刻比較の構文は、値がタイムスタンプまたは日時のどちらで保存されているかによって異なります。

于 2013-04-01T15:57:38.413 に答える
0

date_added フィールドがタイムスタンプであると仮定して、過去 1 時間の上位 5 件の投稿が必要な場合は、次を使用できます。

SELECT   post_id,
         count(comment_id) as comments_count,
         posts.date_added, 'hour' as grouptime
FROM     posts
INNER JOIN comments
ON       posts.post_id = comments.post_id
WHERE    TIMESTAMPDIFF(HOUR, comments.date_added, NOW()) = 0
GROUP BY posts.post_id
ORDER BY count(comment_id) DESC
LIMIT 5

それらすべてが必要な場合は、LIMIT を削除してください。過去 24 時間:

SELECT   post_id,
         count(comment_id) as comments_count,
         posts.date_added, '24 hours' as grouptime
FROM     posts
INNER JOIN comments
ON       posts.post_id = comments.post_id
WHERE    TIMESTAMPDIFF(HOUR, comments.date_added, NOW()) < 24
GROUP BY posts.post_id
ORDER BY count(comment_id) DESC
LIMIT 5

など、さまざまな期間に対応しています。

一度にすべてを取得したい場合は、これらのクエリ間で UNION を使用します。

于 2013-04-15T09:12:57.663 に答える