【问题标题】:Need a query to select specific comments with the name of the writer需要查询以选择带有作者姓名的特定评论
【发布时间】:2018-10-22 14:18:54
【问题描述】:

我有一个数据库包含3个表,如下:

CREATE TABLE users
(
    id SERIAL PRIMARY KEY,
    name VARCHAR(30) NOT NULL,
    password VARCHAR(60) NOT NULL,
    phone VARCHAR(10) NOT NULL,
    email VARCHAR(30) UNIQUE
);

CREATE TABLE posts 
(
    id SERIAL PRIMARY KEY,
    body TEXT NOT NULL,
    user_id INTEGER REFERENCES users(id) 
);

CREATE TABLE comments
(
    id SERIAL PRIMARY KEY,
    body TEXT NOT NULL,
    post_id INTEGER REFERENCES posts(id),
    user_id INTEGER REFERENCES users(id)
    -- parent_id INTEGER REFERENCES comments(id)
);

我需要一个查询来使用该帖子的 id 为一个特定帖子选择所有 cmets。让我苦恼的是如何选择写评论的用户名!

这是我尝试过的:

select  
    c.body as cbody, p.body as pbody, c.user_id as user_id 
from 
    users u 
inner join 
    posts p on u.id = p.user_id 
inner join 
    comments c on c.post_id = p.id 
where 
    p.id=($1)

有什么帮助吗??

【问题讨论】:

  • 您当前的查询有什么问题?
  • 我无法返回写评论的用户的正确姓名! @TimBiegeleisen
  • 我无法返回写评论的用户的正确姓名! @TimBiegeleisen

标签: sql database postgresql select


【解决方案1】:

我会使用 Comments 表作为 FROM 子句中的第一个表,因为这是您的查询数据的主表。 (只是个人喜好,不是要求。)

之后,我将加入 Comments.user_id 上的用户表以获取 cmets 的作者。

您可能不希望每条评论都包含帖子的正文,所以我会省略它。

所以我的查询看起来像这样:

SELECT c.body AS cbody, c.user_id AS user_id, u.name AS uname
FROM Comments c LEFT JOIN Users u ON u.id = c.user_id
WHERE c.post_id=($1);

INNER JOIN 也可能有效,但您需要确保始终填写 Comments.user_id。当 Comments.user_id 为 NULL 时,使用 INNER JOIN 时,该评论将不包含在查询结果中。

【讨论】:

  • 这很酷,但我需要显示特定帖子 ID 的所有 cmets。所以我需要添加条件“where”!我在哪里以及如何做到这一点? @巴特
  • 刚刚添加。很抱歉给您带来不便。
  • 我从查询中删除了原始帖子的正文,因为恕我直言,您的查询应该只获取特定帖子的评论数据。如果您需要有关帖子的特定详细信息,例如帖子正文和帖子作者,我会为此执行单独的 SELECT 查询。在单个查询中有效地获取所有帖子和评论数据是不可能的(不会在结果中复制大量数据)。
猜你喜欢
  • 2018-01-13
  • 1970-01-01
  • 2022-12-08
  • 1970-01-01
  • 1970-01-01
  • 2011-10-11
  • 1970-01-01
  • 1970-01-01
  • 2016-11-25
相关资源
最近更新 更多