【问题标题】:Two inner joins return empty result两个内连接返回空结果
【发布时间】:2020-06-17 21:10:31
【问题描述】:

我有 3 个非常简单的表,usersprojectsstarred_projects

starred_projects 通过用户 ID 和项目 ID 连接其他 2 个表。

CREATE TABLE projects
(
    project_id integer,
    name character varying(50) COLLATE pg_catalog."default",
    creator_id integer,
)

CREATE TABLE users
(
    user_id integer,
    username character varying(64) COLLATE pg_catalog."default" NOT NULL,
)

CREATE TABLE starred_projects
(
    user_id integer NOT NULL,
    project_id integer NOT NULL
)

对于给定的用户(例如“foo”),我想显示他 starred 的所有项目。 INNER JOIN 是去这里的正确方式吗?当我这样做时,我的结果总是空的。据我在大学的记忆,我需要其中两个,例如:

SELECT
   p.name, u.username // display the name of the project and the user who created it
FROM
   projects p
INNER JOIN
   starred s
ON
   p.creator_id = s.user_id
INNER JOIN
   users u
ON
   u.user_id = p.creator_id
WHERE
   u.username = 'foo'; // display all starred projects of user foo

谁能帮我解决这个问题?

【问题讨论】:

  • 你的代码看起来很合理。
  • 旁注:对于 postgres,您通常最好使用 TEXT 类型而不是 varchar - 请参阅 wiki.postgresql.org/wiki/Don't_Do_This
  • 我认为您的 JOIN 不正确。为什么你有一个starred_projects 表是你没有正确使用它。 projectsstarred_projects 应由 project_id 加入。 users 应该通过user_id 加入starred_projects

标签: sql postgresql join


【解决方案1】:

用户不一定是创造者。

更正确的方法是:

SELECT
   p.name, u.username // display the name of the project and the user who created it
FROM
   projects p
INNER JOIN
   starred s
ON
   p.project_id = s.project_id
INNER JOIN
   users u
ON
   u.user_id = s.user_id
WHERE
   u.username = 'foo';

换句话说,项目的创建者不一定是唯一的用户。因此,您使用 starred 来确定哪些用户在哪些项目中被星标。因此,您将 starred.user_iduser.user_id 匹配,并将 starred.project_idproject.project_id 匹配。

拥有users的用户,以及拥有projects的项目。

【讨论】:

    【解决方案2】:

    您的表名是 starred_projects ,但在 INNER JOIN 中,您将其引用为刚刚加星标。对吗?

    我看不出你的代码有什么问题,你能提供每个表中数据的例子吗?

    【讨论】:

    • 这个答案应该是真正的评论,因为您需要更多信息,而不是实际提供答案。
    • @AdrianKlaver:请注意,贡献者还没有足够的声誉来发表评论。 (虽然它仍然不应该作为答案发布,显然。)
    猜你喜欢
    • 2018-02-14
    • 2013-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多