Получать пользовательские сообщения и / или комментарии в блоге с использованием SQL - PullRequest
0 голосов
/ 02 марта 2012

Эта (Моя) проблема SQL сделает меня сумасшедшим, если ее не решить в этот уик-энд!

Простой общий блог (означает, что многие авторы вносят свой вклад).Давайте рассмотрим две таблицы в моей базе данных:

Сообщений :

  • id
  • author_id
  • title
  • содержание

Комментарии :

  • id
  • author_id
  • post_id
  • content

Цель: я хочу отобразить все действия участника (=> fixed author_id) .Под деятельностью я подразумеваю следующее:

  • Если пользователь создал сообщение и прокомментировал: Отобразите заголовок сообщения и комментарий пользователя
  • Если пользователь создал сообщение, но не прокомментировал: Показать только заголовок сообщения
  • Если пользователь не создал сообщение, но прокомментировал: Показать заголовок сообщения и комментарий пользователя

Я попробовал этот сценарий SQL:

SELECT p.id AS post_id, p.author_id AS post_author_id, c.author_id AS comment_author_id, title, c.content

FROM Posts p JOIN Comments c ON p.id = c.post_id

WHERE p.author_id = $userId

OR c.author_id = $userId

Выглядит хорошо, но это не дает мне строку, где пользователь создал пост, но не комментирует.

Есть идеи?Спасибо заранее.

1 Ответ

0 голосов
/ 02 марта 2012

Чтобы имитировать FULL OUTER JOIN в MySQL, вам нужно ОБЪЕДИНИТЬ результаты Внешних сообщений, присоединенных к Комментариям, с внешними комментариями, присоединенными к Сообщениям, например:

SELECT p.id AS post_id, 
       p.author_id AS post_author_id, 
       c.author_id AS comment_author_id,
       p.title, 
       c.content
FROM Posts p 
LEFT JOIN Comments c ON p.id = c.post_id AND c.author_id = $userId
WHERE p.author_id = $userId
UNION ALL
SELECT p.id AS post_id, 
       p.author_id AS post_author_id, 
       c.author_id AS comment_author_id,
       p.title, 
       c.content
FROM Posts p 
RIGHT JOIN Comments c ON p.id = c.post_id
WHERE c.author_id = $userId
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...