MySQL - Право присоединиться ИЛИ Право присоединиться - PullRequest
0 голосов
/ 12 апреля 2020

Я создаю социальное приложение.

Я бы хотел выбрать все сообщения, с которыми пользователь каким-то образом общался (понравился, прокомментировал или понравился комментарий)

Как я мог этого достичь? Я представляю себе что-то вроде этого:

SELECT p.* FROM posts p
    RIGHT JOIN postLikes pl ON pl.postId = p.id AND pl.userId = :userId
    OR
    RIGHT JOIN postComments pc ON pc.postId = p.id AND pc.userId = :userId
    OR
    RIGHT JOIN postCommentLikes pcl ON pcl.postId = p.id AND pcl.userId = :userId
GROUP BY p.id
ORDER BY p.id DESC LIMIT :startIndex, 20

Я бы хотел добиться этого одним запросом, потому что у меня есть система подкачки (20 сообщений на страницу)

Использование UNION ALL может испортить эту систему.

См .:

SELECT res.* FROM ((SELECT p.*, p.id AS postId FROM posts p
    RIGHT JOIN postLikes pl ON pl.postId = p.id AND pl.userId = :userId)
 UNION ALL
 (SELECT * FROM posts p.*, p.id AS postId
    RIGHT JOIN postComments pc ON pc.postId = p.id AND pc.userId = :userId)
 UNION ALL
 (SELECT * FROM posts p.*, p.id AS postId
    RIGHT JOIN postCommentLikes pcl ON pcl.postId = p.id AND pcl.userId = :userId)) AS res
GROUP BY postId
ORDER BY postId DESC LIMIT :startIndex, 20

Таким образом порядок будет испорчен , и поэтому я не знаю, что правильно startIndex

1 Ответ

1 голос
/ 12 апреля 2020

Вы можете использовать EXISTS следующим образом:

SELECT p.* FROM posts p
WHERE 
  EXISTS (SELECT 1 FROM postLikes pl WHERE pl.postId = p.id AND pl.userId = :userId)
  OR
  EXISTS (SELECT 1 FROM postComments pc WHERE pc.postId = p.id AND pc.userId = :userId)
  OR
  EXISTS (SELECT 1 FROM postCommentLikes pcl WHERE pcl.postId = p.id AND pcl.userId = :userId)
ORDER BY p.id DESC LIMIT :startIndex, 20

или с UNION и оператором IN:

SELECT * FROM posts 
WHERE id IN (
  SELECT postId FROM postLikes WHERE userId = :userId
  UNION 
  SELECT postId FROM postComments WHERE userId = :userId
  UNION 
  SELECT postId FROM postCommentLikes WHERE userId = :userId
) 
ORDER BY id DESC LIMIT :startIndex, 20
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...