Два внутренних соединения возвращают пустой результат - PullRequest
0 голосов
/ 18 июня 2020

У меня есть 3 очень простых таблицы, users, projects и starred_projects.

starred_projects соединяет две другие таблицы, имея идентификатор пользователя и идентификатор проекта.

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 - правильный путь к go? Когда я это делаю, мой результат всегда пустой. Насколько я помню из университета, мне понадобилось бы их два, например:

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

Может ли кто-нибудь мне в этом помочь?

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

Пользователи не обязательно создатели.

Более правильный способ:

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.user_id с user.user_id и сопоставляете starred.project_id с project.project_id .

Пользователи с пользователями и проекты с проектами .

2 голосов
/ 18 июня 2020

У вас есть имя вашей таблицы как starred_projects, но в вашем INNER JOIN вы указываете его как только что помеченное. Это правильно?

Я не вижу ничего плохого в вашем коде, можете ли вы предоставить примеры данных в каждой таблице?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...