У меня есть две таблицы в одной собрано количество лайков по фотографии, а во второй по той же фото кол-во комментариев. Ну по разным фоткам конечно.
Как обьединить две таблицы в одну, что бы выводились все photo_id даже если по нему нет лайка или комментария?
Я делаю так:
SELECT
v_photo_like_count.photo_id,
v_photo_like_count.like_count,
v_photo_comment_count.comment_count
FROM v_photo_comment_count
RIGHT OUTER JOIN v_photo_like_count
ON v_photo_comment_count.photo_id = v_photo_like_count.photo_id
Но в исходной таблице присутствует только одна фотка у которой есть и лайки и комментарии, как сделать что бы photo_id выводился в любом случае?
Берем таблицу фотографий (она у вас должна быть) и через LEFT JOIN присоединяем сначала таблицу лайков, а потом коментов (или наоборот порядок не важен. Присоединять нужно к исходной таблице)
SELECT p.id, l.like_count, c.comment_count
FROM v_photos p
LEFT JOIN v_photo_comment_count c ON c.photo_id = p.id
LEFT JOIN v_photo_like_count l ON l.photo_id = p.id
Работать должно быстрее чем через UNION
Т.к. full join в MySQL не предусмотрен, т.к. без него можно обойтись заменой на left join ... union ... right join, что, собственно, тут и надо сделать:
select cc.photo_id,
cc.comment_count,
ifnull(lc.like_count, 0) as like_count
from v_photo_comment_count cc
left join v_photo_like_count lc on cc.photo_id = lc.photo_id
UNION
select lc.photo_id,
ifnull(cc.comment_count, 0) as comment_count,
lc.like_count
from v_photo_comment_count cc
right join v_photo_like_count lc on cc.photo_id = lc.photo_id
В данном случае необходим full join, которого нет в MySQL, но его можно легко заменить union двух выборок с группировкой по колонке, по которой предполагалось соединение:
select photo_id, sum(like_count) like_count, sum(comment_count) comment_count
from (
SELECT photo_id, like_count, null comment_count
from v_photo_like_count
union all
SELECT photo_id, null, comment_count
from v_photo_comment_count
) x
group by photo_id
LEFT JOIN на обе таблицы:
select photo.*, t1.num, t2.num
from photo
left join t1 using(f)
left join t2 using(f)
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости