В сообщении могут быть комментарии или нет. Используйте LEFT JOIN
вместо INNER JOIN
.
Сообщение может иметь ответы или нет. В этом соединении используйте LEFT JOIN
вместо INNER JOIN
.
Когда используется LEFT JOIN
, условие, подобное WHERE comments.deleted = 0
, которое включает поле (из правой таблицы (comments
) в LEFT JOIN), LEFT JOIN отменяется. Итак, мы должны поместить это условие в предложение ON
, а не в WHERE
.
SELECT *
FROM posts p
LEFT JOIN comments c
ON p.post_id = c.post_id
AND c.deleted = 0
LEFT JOIN replies r
ON p.post_id = r.post_id
AND r.deleted = 0
WHERE p.user_id = $user_id
Если подумать более четко, приведенное выше покажет, что описывает вопрос, но в случаях, скажем, с 4 комментариями и 3 ответами, будет возвращено 12 строк (3x4). Который, вероятно, не хотел. Следующая вторая попытка не имеет такой проблемы.
Я не вижу post.text
или comment.text
или reply.text
в таблицах, но в любом случае, вы поймете идею. Вы можете удалить строки 3 text
, если не подходит.
( SELECT p.post_id AS post_id
, 0 AS type
, p.post_id AS id
, p.text AS text
FROM posts p
WHERE p.user_id = $user_id
)
UNION ALL
( SELECT p.post_id AS post_id
, 1 AS type
, c.comment_id AS id
, c.text AS text
FROM posts p
JOIN comments c
ON p.post_id = c.post_id
WHERE p.user_id = $user_id
AND c.deleted = 0
)
UNION ALL
( SELECT p.post_id AS post_id
, 2 AS type
, r.reply_id AS id
, r.text AS text
FROM posts p
JOIN replies r
ON p.post_id = r.post_id
WHERE p.user_id = $user_id
AND r.deleted = 0
)
ORDER BY post_id
, post_type
, id
0,1,2 означает пост, комментарий, ответ.