подсчет ассоциированных строк в нескольких таблицах с левым соединением

#mysql #sql

#mysql #sql

Вопрос:

Я пытаюсь выбрать Posts с помощью ассоциированных номеров Comments и Likes .

Это мой запрос

 SELECT `waller_posts`.*,
       COUNT(waller_comments.id) AS num_comments,
       COUNT(waller_likes.id) AS num_likes
FROM `waller_posts`
LEFT JOIN `waller_comments` ON `waller_comments`.`post_id` = `waller_posts`.`id`
LEFT JOIN `waller_likes` ON `waller_likes`.`post_id` = `waller_posts`.`id`
WHERE `wall_id` = 1
  AND `wall_type` = "User"
GROUP BY `waller_posts`.`id`
 

Когда я добавляю второй left join в этом случае likes , результаты num_comments и num_likes получаются неверными. Как я могу выполнить такой запрос?

Ответ №1:

Запрос создается, чтобы предоставить вам все возможные комбинации комментариев и лайков к сообщению.

Вероятно, проще всего просто использовать COUNT (DISTINCT …) :-

 SELECT `waller_posts`.*,
       COUNT(DISTINCT waller_comments.id) AS num_comments,
       COUNT(DISTINCT waller_likes.id) AS num_likes
FROM `waller_posts`
LEFT JOIN `waller_comments` ON `waller_comments`.`post_id` = `waller_posts`.`id`
LEFT JOIN `waller_likes` ON `waller_likes`.`post_id` = `waller_posts`.`id`
WHERE `wall_id` = 1
  AND `wall_type` = "User"
GROUP BY `waller_posts`.`id`
 

Обратите внимание, что ваш запрос основан на функции MySQL, но это может привести к ошибке в большинстве вариантов SQL. Для большинства вариантов SQL вам необходимо перечислить ВСЕ неагрегированные столбцы в предложении GROUP BY .

Комментарии:

1. Похоже, это работает!! Я только что попробовал свой редактор sql, дайте мне пару минут, чтобы протестировать его, спасибо !! 🙂

Ответ №2:

Используйте Distinct предложение, потому что оно будет отображать комбинацию данных таблицы like и comment

 SELECT `waller_posts`.*,
       COUNT(DISTINCT waller_comments.id) AS num_comments,
       COUNT(DISTINCT waller_likes.id) AS num_likes
FROM `waller_posts`
LEFT JOIN `waller_comments` ON `waller_comments`.`post_id` = `waller_posts`.`id`
LEFT JOIN `waller_likes` ON `waller_likes`.`post_id` = `waller_posts`.`id`
WHERE `wall_id` = 1
  AND `wall_type` = "User"
GROUP BY `waller_posts`.`id`
 

Комментарии:

1. Поймите мой ответ, если какой-либо запрос даст мне знать. Я объясняю это.

2. Спасибо, Садихсан, очень любезно, но я даже попробовал, как вы сказали, но результат в точности совпадает с моим запросом.