我有一個複雜的PostgreSQL數據庫查詢,我在構建時遇到困難。我有兩個表:一個post
表和一個votes
表。下面是他們的樣子:Postgresql查詢在過去24小時內查找排名最高的表格
的post
表 - 我只包括了id
因爲其他列不是我的問題很重要
----
| id |
----
的votes
表 - vote_type
可以是1
(給予好評),-1
(downvote)或0
(中性)。 post_id
是單次投票帖子ID的ID。
---- --------- ----------- --------------------------------
| id | post_id | vote_type | timestamp |
---- --------- ----------- --------------------------------
| 1 | 4 | 1 | 2017-03-30 12:17:12.246765-07 |
這裏就是我想實現:
SELECT postsTable.*, votesTable.votes
FROM posts AS postsTable
RIGHT JOIN (
SELECT sum(vote_type) votes, post_id
FROM votes
WHERE (extract(day from age(now(), timestamp)) < 1)
GROUP BY post_id)
AS votesTable
ON (postsTable.id = votesTable.post_id)
ORDER BY votes DESC NULLS LAST LIMIT 10;
:過去24小時
我首先構建以下查詢中查詢前10名得票最多的帖子返回類似於:
---- ---------------------- -------
| id | other_colums_between | votes |
---- ---------------------- -------
| 8 | ... | 1 |
它與正確的帖子略有差異,但是投票欄只顯示了過去24小時內的投票總數,而不是自帖子發佈以來的總投票數(這正是我想要的)。原因是因爲我總結了過去24小時內的投票數,而不是自帖子創建以來的所有投票數。
說post
與id
8有10票。查詢只返回1票,因爲在過去的24小時內只有一個upvote。
因此,查詢應該返回:
---- ---------------------- -------
| id | other_colums_between | votes |
---- ---------------------- -------
| 8 | ... | 10 |
所以我知道我必須解決,但我不知道該怎麼做。我已經嘗試了下面的查詢,但這不是我想要的,但我覺得我正在接近。儘管如此,我還沒有在過去24小時內對帖子進行過濾。
SELECT postsTable.*, votesTable.vote_type, extract(day from age(now(), votesTable.timestamp)) age
FROM posts AS postsTable
RIGHT JOIN (SELECT * FROM votes)
AS votesTable ON (postsTable.id = votesTable.post_id)
ORDER BY vote_type DESC NULLS LAST LIMIT 10;
返回:
---- ---------------------- ----------- -----
| id | other_colums_between | vote_type | age |
---- ---------------------- ----------- -----
| 8 | ... | 1 | 3 |
正如你能告訴我在SQL初學者。我還要求提供一些關於如何簡化上述查詢的建議。感謝您的幫助。
所以,如果我的理解是正確的,你應該擺脫年齡(這其中'WHERE(提取物(現在每天(),時間戳) )<1)' –
要澄清,neutral(0)沒有資格作爲投票嗎? – toonice
是0沒有資格作爲投票@toonice –