MySQL запрос на обьединение

208
12 декабря 2018, 06:30

У меня есть две таблицы в одной собрано количество лайков по фотографии, а во второй по той же фото кол-во комментариев. Ну по разным фоткам конечно.

Как обьединить две таблицы в одну, что бы выводились все 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 выводился в любом случае?

Answer 1

Берем таблицу фотографий (она у вас должна быть) и через 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

Answer 2

Т.к. 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
Answer 3

В данном случае необходим 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
Answer 4

LEFT JOIN на обе таблицы:

select photo.*, t1.num, t2.num
from photo
left join t1 using(f)
left join t2 using(f)
READ ALSO
Оибка mysql ERROR 1045 (28000): Access denied for user

Оибка mysql ERROR 1045 (28000): Access denied for user

Даже когда пытаюсь посмотреть версию mysql - mysql -v Выходит ошибка:

176
Нажать(утопить) кнопку при нажатии на нее Javascript

Нажать(утопить) кнопку при нажатии на нее Javascript

Прошу прощения за, возможно, простой вопросКак зажать кнопку используя обработчик событий onclick(без использования JQuery):

170
Как убрать анимацию нажатия кнопки Javascript

Как убрать анимацию нажатия кнопки Javascript

Кнопка реализована при помощи Bootstrap классов

195
Горизонтальное меню: Ширина иконок

Горизонтальное меню: Ширина иконок

Хочу создать аналогичное меню с иконками от fontawesome Сделал я все через divЕдинственная проблема которая у меня создалась это ширина каждого...

170