СОЕДИНИТЕ 3 таблицы (или перекрестное соединение?) И выведите 2 раза значение users.name - PullRequest
0 голосов
/ 02 ноября 2018

Я пытаюсь объединить 3 таблицы - пользователей, сообщения и комментарии, чтобы получить такие значения, как заголовок сообщения, автор сообщения, заголовок комментария, автор комментария.

users (id, name)
posts (id, content, user_id)
comments (content, user_id, post_id)

Прямо сейчас у меня есть запрос:

SELECT posts.id AS POST_ID, posts.content AS Post, posts.user_id AS PostAuthorID,
users.name AS PostAuthorName,
comments.content AS comment, comments.user_id AS CommentsAuthorID
FROM posts
JOIN users on users.id = posts.user_id
JOIN comments ON users.id = comments.post_id;

Мой вопрос: как получить имя автора каждого комментария и как получить автора поста? Прямо сейчас, делая JOIN users on users.id = posts.user_id У меня есть автор сообщения, но как бороться с именем автора комментария? Когда я пытаюсь добавить еще одно условие для последнего присоединения - JOIN comments ON users.id = comments.post_id AND users.id = comments.user_id, я получаю таблицу с сообщениями и комментариями, созданными тем же пользователем. Любая помощь приветствуется.

Ответы [ 3 ]

0 голосов
/ 02 ноября 2018
Select comments.user_id AS CommentsAuthorID
Where posts.id = x
From (posts left join comments on posts.id = comments.post_id

Если вам просто нужен comments.user_id, объединитесь с постами и комментариями.

Когда вы хотите comments.users.name, запрос будет:

Select comments.user_id AS CommentsAuthorID comments.users_name AS UserName 
Where posts.id = x
From (posts left join comments on posts.id = comments.post_id
0 голосов
/ 02 ноября 2018

Я уверен, что вы имели в виду:

ON posts.id = comments.post_id;

где ваш запрос в данный момент говорит:

ON users.id = comments.post_id;

Тогда просто присоединитесь к users дважды:

SELECT p.id AS post_id, p.content AS post, p.user_id AS post_author_id
     , pu.name AS post_author_name
     , c.content AS comment, c.user_id AS comment_author_id
     , cu.name AS comment_author_name
FROM posts    p
JOIN users    pu ON pu.id = p.user_id
JOIN comments c  ON c.post_id = p.id
JOIN users    cu ON cu.id = c.user_id;

Возвращает несколько строк для сообщений с несколькими комментариями. Один за комментарий. Возвращает Ничего для сообщений без комментариев. Чтобы включить посты без комментариев (или если какой-либо столбец идентификатора может быть пустым), используйте LEFT JOIN вместо ...

0 голосов
/ 02 ноября 2018

user (user_id, name)
post (post_id, user_id, descrition)
comment (cm_id, post_id, content)
you join  user with post by user_id and post with comment by post_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...