2013-04-01 101 views
0

任何人都可以幫助我處理這種類型的查詢。MySQL:按日期間隔級聯過濾

我:

  • posts
  • comments

它們通過comments.post_id = posts.post_id列鏈接。

我用戶可以通過評論過去後置濾波器:

  • 1小時
  • 24小時
  • 2天后,等

如果用戶選擇,以示對職位過去1小時,但這期間沒有帖子,我們需要一步一步來:

選擇過去的帖子1 hour,如果爲空 - 過去24 hours,如果爲空 - 過去2 days,如果爲空 - 自成立以來(沒有任何條件)。

任何人都可以請幫我建立這樣的查詢嗎?

UPD

「的意見篩選職位」 之類指算意見。

所以實際上目標是要求「顯示我的帖子按照過去XXX小時離開的評論數排序」

如果選擇「過去一小時」,但過去1小時內沒有留言留言,我們需要取回過去24小時留言的帖子(按留言數排序)等等。

表結構

文章:

  • POST_ID
  • 標題
  • 內容
  • DATE_ADDED

評論

  • COMMENT_ID
  • 內容
  • POST_ID
  • DATE_ADDED

所以鏈接posts.post_id = comments.post_id

我想有一個結果,當用戶查看最多評論過去一小時的帖子:排序

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. 排在首位的是已經註釋2個職位由於過去一小時,並通過評論排序計數。
  2. 接下來,我們將發佈過去一天內發表的評論。
  3. 下一頁 - 帖子,因爲最近兩天評論
  4. 的帖子,因爲過去一週評論,他們再次應由意見,責令數
  5. 在過去的一個月
  6. 在過去的一年
  7. 在年底此列表中我們需要放置比一年前更多的評論文章,並且還應該按照評論次序排列。

在此先感謝。

+0

我認爲你最好的解決方案是在'if()'語句中包裝每個查詢。如果記錄計數爲0,則運行下一個查詢。 –

+0

但過濾器間隔存儲在另一個表中,因此管理員可能會增加間隔數。例如。他可以創建另一個過濾器「過去一週」。因此,在這種情況下,我們需要在每次更改過濾器時修改查詢 –

+0

如果他可以創建新過濾器,然後只是遍歷包含所有可能日期範圍的查詢 –

回答

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 
      . . . 
    ) 

時間比較的語法取決於值是存儲爲時間戳還是日期時間。

0

如果你想在最後一小時前5名的帖子,假設你DATE_ADDED字段是時間戳,您可以使用:

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 

如果你想所有的人,只是刪除限制。在過去的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。