多对多关系,以确定用户是否喜欢帖子

问题描述 投票:0回答:2

我有一个包含所有帖子的表格。我还有一个表,当用户喜欢带有外键user_id和post_id的帖子时,会添加一行。

我想检索所有帖子的列表以及特定用户是否喜欢该帖子。使用外部联接我最终得到一些帖子两次。一次为用户1,一次为用户2.如果我使用WHERE过滤likes.user_id = 1 AND likes.user_id为NULL我没有得到只有其他用户喜欢的帖子。

理想情况下,我会使用单个查询执行此操作。 SQL不是我的优势,所以我甚至不确定是否需要子查询或者连接是否足够。

对于这种含糊不清的道歉,但我认为这是一个足够普遍的问题,它应该是有道理的。

编辑:我已经创建了一个DB小提琴与我提到的两个查询。 https://www.db-fiddle.com/f/oFM2zWsR9WFKTPJA16U1Tz/4

更新:昨晚弄清楚了。这就是我最终得到的结果:

SELECT
posts.id AS post_id,
posts.title AS post_title,
CASE
WHEN EXISTS (
  SELECT *
  FROM likes
  WHERE posts.id = likes.post_id
  AND likes.user_id = 1
) THEN TRUE
  ELSE FALSE END
  AS liked
FROM posts;

虽然我能够解决它,但感谢@wildplasser的回答。

sql postgresql
2个回答
2
投票

数据(我需要稍微更改一下,因为不应该分配给连续出版物):


 CREATE TABLE posts (
  id serial,
  title varchar
);

CREATE TABLE users (
  id serial,
  name varchar
);

CREATE TABLE likes (
  id serial,
  user_id int,
  post_id int
);

INSERT INTO posts (title) VALUES ('First Post');
INSERT INTO posts (title) VALUES ('Second Post');
INSERT INTO posts (title) VALUES ('Third Post');

INSERT INTO users (name) VALUES ('Obama');
INSERT INTO users (name) VALUES ('Trump');

INSERT INTO likes (user_id, post_id) VALUES (1, 1);
INSERT INTO likes (user_id, post_id) VALUES (2, 1);
INSERT INTO likes (user_id, post_id) VALUES (2, 2);

-- I want to retrieve a list of ALL of the posts and whether or not a specific user has liked that post
SELECT id, title
        , EXISTS(
                --EXISTS() yields a boolean value
                SELECT *
                FROM likes lk
                JOIN users u ON u.id = lk.user_id AND lk.post_id=p.id
                WHERE u.name ='Obama'
                ) AS liked_by_Obama
FROM posts p
        ;

结果:


 id |    title    | liked_by_obama 
----+-------------+----------------
  1 | First Post  | t
  2 | Second Post | f
  3 | Third Post  | f
(3 rows)

0
投票

据我所知,你有两个表,如post表,包括来自不同用户的所有帖子,以及与user.idpost id相似的表。如果你想只翻阅帖子那么

select * from posts

如果您还需要用户信息,这些信息存在于user表格中,那么您可以在下面进行操作。

select user.user_name, post.postdata from user,post where post.userid=user.userid

在上面的查询中,user_nameuser表中的列名,postdatapost表中的列。

© www.soinside.com 2019 - 2024. All rights reserved.