Я создаю социальное приложение.
Я бы хотел выбрать все сообщения, с которыми пользователь каким-то образом общался (понравился, прокомментировал или понравился комментарий)
Как я мог этого достичь? Я представляю себе что-то вроде этого:
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