【发布时间】:2021-04-07 18:32:20
【问题描述】:
问题的标题可能不是很清楚 - 我不确定如何命名这个问题,但我希望我的解释能让我的问题更清楚。
我有 3 张桌子:
[1] 得分
| id | rating_type |
|---|---|
| 1 | UPVOTE |
| 2 | UPVOTE |
| 3 | DOWNVOTE |
| 4 | UPVOTE |
| 5 | DOWNVOTE |
| 6 | DOWNVOTE |
[2] post_score
| post_id | score_id |
|---|---|
| 1 | 1 |
| 1 | 2 |
| 1 | 3 |
| 2 | 4 |
| 2 | 5 |
| 2 | 6 |
和 [3] 发布
| id | title |
|---|---|
| 1 | title1 |
| 2 | title2 |
我的目标是按分数排序 [3] 发布表。
假设UPVOTE代表值为1,DOWNVOTE代表值为-1;在这个例子中,id = 1的帖子有3个与其相关的分数,它们的值是UPVOTE、UPVOTE、DOWNVOTE,使得这个帖子的“数字分数”:2;
同样,id = 2 的帖子也有 3 个分数,这些值是:UPVOTE、DOWNVOTE、DOWNVOTE,得出“数字分数”:-1;
我将如何按此分数排序帖子表?在这个例子中,如果我按分数 asc 排序,我会得到以下结果:
| id | title |
|---|---|
| 2 | title2 |
| 1 | title1 |
我的尝试并没有走多远,我目前被这个查询困在这里,它并没有真正做任何有用的事情:
WITH fullScoreInformation AS (
SELECT * FROM score s
JOIN post_score ps ON s.id = ps.score_id),
upvotes AS (SELECT * FROM fullScoreInformation WHERE rating_type = 'UPVOTE'),
downvotes AS (SELECT * FROM fullScoreInformation WHERE rating_type = 'DOWNVOTE')
SELECT p.id, rating_type, title FROM post p JOIN fullScoreInformation fsi on p.id = fsi.post_id
我正在使用 PostgreSQL。查询将在我的 Spring Boot 应用程序中使用(我通常使用本机查询)。
也许这个数据结构很糟糕,我应该以不同的方式构建我的实体?
【问题讨论】:
标签: sql postgresql subquery sql-order-by lateral-join