#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
условию.