SQL объединение двух сложных запросов - PullRequest
0 голосов
/ 04 мая 2020

Существует 4 таблицы:

posts(id

post_share(shared_by, post_id

friendship(friend_one, friend_two, status)

add_viewer(id

Используя приведенные выше 4 таблицы, мне нужно получать посты для отображения в ленте новостей пользователя. В настоящее время я использую только первый запрос, что означает, что я не добавляю общий доступ друзей пользователя в его / ее ленту новостей. Теперь мне нужно показать общий пост тоже, как в фейсбуке.

Для этого я создал новый запрос (2-й). Теперь я хочу соединить их вместе и получить только одну таблицу или . Хотелось бы узнать, есть ли лучший способ справиться с этим

Предполагая, что в настоящий момент вошедший в систему user_id равен 22,

SELECT concat(a.fname, ' ', a.lname) as name, a.id as user_id , p.id as post_id, p.content, p.media FROM posts p
INNER JOIN add_viewers a
ON p.user_id = a.id
WHERE p.user_id in (
  SELECT a.id FROM friendships f
  INNER JOIN add_viewers a
  ON f.friend_one = a.id OR f.friend_two = a.id
  WHERE friend_one=22 OR friend_two=22 AND f.status='confirmed'
  GROUP BY a.id
)
ORDER BY created_at DESC
LIMIT 10
OFFSET 0

во втором запросе, s.shared_by означает человека, который разделяет сообщение, и p.user_id означает человека, который создал сообщение.

SELECT concat(a.fname, ' ', a.lname) as name, a.id as user_id , p.id as post_id, p.content, p.media FROM post_shares s
INNER JOIN posts p
ON p.id = s.post_id
INNER JOIN add_viewers a
ON p.user_id = a.id
WHERE s.shared_by in (
          SELECT a.id FROM friendships f
          INNER JOIN add_viewers a
          ON f.friend_one = a.id OR f.friend_two = a.id
          WHERE friend_one=22 OR friend_two=22 AND f.status='confirmed'
          GROUP BY a.id
)
ORDER BY created_at DESC
LIMIT 10
OFFSET 0

1 Ответ

0 голосов
/ 04 мая 2020

Попробуйте это

  With t as
  (SELECT a.id as aid FROM friendships f
          INNER JOIN add_viewers a
          ON f.friend_one = a.id OR 
          f.friend_two = a.id
          WHERE friend_one=22 OR 
          friend_two=22 AND 
           f.status='confirmed'
          GROUP BY a.id) 

SELECT concat(a.fname, ' ', a.lname) as name, a.id as user_id , p.id as post_id, p.content, p.media FROM
  post_shares s
INNER JOIN posts p
ON p.id = s.post_id
INNER JOIN t
ON p.user_id = t.aid
OR s.shared_by = t.aid 

ORDER BY created_at DESC
LIMIT 10
OFFSET 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...