выбрать количество строк из 2 таблиц и объединить в одну строку (mysqli)

я создаю веб-приложение, как facebook от php и mysqli

в моем приложении у меня есть таблица для сообщений, одна таблица для лайков и одна таблица для комментариев

я хочу получить количество комментариев и лайков каждого поста в одном ряду с его post_id !!!

я пытаюсь некоторые запросы любит это:

select `tblpost`.`post_id`,  COALESCE(TCOMM.`comment_num`,0) as `c_num`, COALESCE(TLIKE.`like_num`,0) as `l_num`
from
(select `tblpost`.`post_id`, count(*) as `like_num` from `tblpost` join `tbllikes` on `tbllikes`.`post_id` = `tblpost`.`post_id` group by `tblpost`.`post_id`
) TLIKE
inner join
(select `tblpost`.`post_id`, count(*) as `comment_num` from `tblpost` join `tblcomments` on `tblcomments`.`post_id` =  `tblpost`.`post_id` group by `tblpost`.`post_id`) TCOMM
on
TCOMM.`post_id` = TLIKE.`post_id`

но я не знаю в чем моя проблема

1

Решение

Вы можете рассчитывать различия с двумя левыми соединениями.

Примерно так будет работать, если есть поля like_id а также comment_id в таблицах tbllikes а также tblcomments

SELECT
tblpost.post_id AS post_id,
COUNT(DISTINCT tbllikes.like_id) AS likes,
COUNT(DiSTINCT tblcomments.comment_id) AS comments
FROM tblpost
LEFT JOIN tbllikes ON tbllikes.post_id = tblpost.post_id
LEFT JOIN tblcomments on tblcomments.post_id =  tblpost.post_id
GROUP BY tblpost.post_id
2

Другие решения

Во-первых, я думаю, вы можете значительно упростить свой запрос:

select l.post_id,
COALESCE(c.comment_num, 0) as c_num, COALESCE(l.like_num, 0) as l_num
from  (select l.post_id, count(*) as like_num
from tbllikes l
group by l.post_id
) l inner join
(select c.post_id, count(*) as comment_num
from tblcomments c
group by c.post_id
) c
on l.post_id = c.post_id;

Это даст вам сообщения, которые имеют как лайки, так и комментарии. Чтобы получить то, что вы хотите, используйте left join:

select p.post_id,
COALESCE(c.comment_num, 0) as c_num, COALESCE(l.like_num, 0) as l_num
from tblpost p left join
(select l.post_id, count(*) as like_num
from tbllikes l
group by l.post_id
) l
on l.post_id = p.post_id left join
(select c.post_id, count(*) as comment_num
from tblcomments c
group by c.post_id
) c
on c.post_id = p.post_id;
1

По вопросам рекламы [email protected]