【发布时间】:2015-06-16 20:51:36
【问题描述】:
我正在制作 Reddit 克隆,但在查询我的帖子列表时遇到了问题,给定一个登录用户,该列表显示登录用户是否对每个帖子都投了赞成票。我做了一个小例子让事情变得更简单。
我试图为每个不同的 post_id 返回一行,但将 upvoted 列的优先级设置为 t > f > null。
对于这个示例数据:
> select * from post;
id
----
1
2
3
> select * from users;
id
----
1
2
> select * from upvoted;
user_id | post_id
---------+---------
1 | 1
2 | 1
如果给我user_id = 1,我希望我的查询返回:
postid | user_upvoted
--------+--------------
1 | t
2 | f
3 | f
由于 user1 对 post1 投了赞成票,upvoted 是 t。由于 user1 没有为 post2 投票,upvoted 是 f。 post3 也一样。
架构
CREATE TABLE IF NOT EXISTS post (
id bigserial,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS users (
id serial,
PRIMARY KEY (id)
);
CREATE TABLE IF NOT EXISTS upvoted (
user_id integer
REFERENCES users(id)
ON DELETE CASCADE ON UPDATE CASCADE,
post_id bigint
REFERENCES post(id)
ON DELETE CASCADE ON UPDATE CASCADE,
PRIMARY KEY (user_id, post_id)
);
到目前为止我尝试了什么
SELECT post.id as postid,
CASE WHEN user_id=1 THEN true ELSE false END as user_upvoted
FROM post LEFT OUTER JOIN upvoted
ON post_id = post.id;
这给了我:
postid | user_upvoted
--------+--------------
1 | t
1 | f
2 | f
3 | f
由于连接,查询产生了两个“重复”行。我想优先使用t > f > null 的行。所以我想保留1 | t 行。
【问题讨论】:
标签: sql postgresql left-join greatest-n-per-group