Неправильный подсчет суммы в левом соединении

#php #mysql

#php #mysql

Вопрос:

Я получаю неправильный подсчет суммы для запроса в левом соединении.

Это 2 отдельных запроса, которые по отдельности дают правильный результат.

 SELECT wallpaper_id FROM `contest_participants` WHERE contest_id=2

SELECT wallpaper_id, SUM(upvotes) FROM `contest_wallpaper_upvote` WHERE contest_id=2 GROUP BY wallpaper_id
  

Я использовал объединение для суммирования голосов, как показано ниже

 Select distinct p.wallpaper_id, sum(u.upvotes) from contest_participants p
Left join contest_wallpaper_upvote as u
On p.wallpaper_id = u.wallpaper_id
Where p.contest_id = 2  group by p.wallpaper_id
  

Проблема в том, что если в таблице upvote нет записей для wallpaper_id, это приводит к неправильному подсчету суммы.

Кто-нибудь может помочь мне исправить запрос?

Спасибо

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

1. какая сумма будет правильной, если для wallpaper_id нет положительных голосов?

2. Должно быть 0, если нет повышающего голоса

3. используйте противоположное объединение, с 0 в качестве значения по умолчанию для суммы, если нет положительных голосов, например makandracards.com/makandra /…

4. Можете ли вы добавить полную структуру таблиц, а также некоторые данные?

Ответ №1:

Вы можете проверить, как показано ниже. Если u.wallpaper_id равно нулю, то вы можете добавить 0 в противном случае u.upvotes

 Select distinct p.wallpaper_id, sum(if(u.wallpaper_id is null, 0, u.upvotes)) as upvotes from contest_participants p
Left join contest_wallpaper_upvote as u
On p.wallpaper_id = u.wallpaper_id AND u.contest_id = 2
Where p.contest_id = 2  group by p.wallpaper_id
  

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

1. он выдает неправильные значения. Для идентификатора, который существует в таблице участников, но не в таблице голосов.

2. Есть таблица конкурса, в которой есть записи для обоев, и есть таблица повышения голосов, которая добавляется при записи, когда кто-то повышает обои.

Ответ №2:

Удалить distinct . Не имеет смысла, поскольку вы группируете по wallpaper_id . И добавьте contest_id к LEFT JOIN условию.