【问题标题】:Many-to-many relationship to determine if user has liked a post多对多关系以确定用户是否喜欢帖子
【发布时间】:2018-02-28 22:41:17
【问题描述】:

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

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

理想情况下,我会使用单个查询来完成此操作。 SQL 不是我的强项,所以我什至不确定是否需要子查询或连接是否足够。

抱歉这么含糊,但我认为这是一个足够常见的查询,应该有一定的意义。

编辑:我用我提到的两个查询创建了一个 DB Fiddle。 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 的回答。

【问题讨论】:

  • 您能否提供更多上下文/代码 sn-ps,例如您的模型?
  • 如果你能提供一个例子,也许能更具体地说明你想要的结果如何,那就太好了。
  • 我现在已经更新了一个 DB Fiddle,其中包含我上面提到的模式和两个查询。

标签: sql postgresql


【解决方案1】:

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


 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)

【讨论】:

  • 谢谢@wildplasser。昨晚想通了。我使用了一个稍微不同的查询。我会把它添加到我的帖子中。我只为小提琴分配了连续剧,否则我不会这样做。
  • 我的意思是:你不需要 CASE...END,因为 EXISTS() 的结果值一个布尔值。
  • 当然,我还没有将它加载到我的应用程序中。我认为使用CASE...END,您将能够定义要在存在和不存在时使用的值。如果你需要一个布尔值,EXISTS() 会更干净。
【解决方案2】:

据我了解,您有两个表,例如包含来自不同用户的所有帖子的 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 表中的列。

【讨论】:

  • 感谢您的快速回复。我将整理一个小提琴示例并编辑我的帖子。
猜你喜欢
  • 2019-11-16
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-13
相关资源
最近更新 更多