@Kirill-Gorelov
С ума с IT

SQl JOIN странно считает?

Парни, привет.

Столкнулся с проблемой, JOIN странно считает количество записей в таблицах.
Задача: нужно посчитать в нескольких таблицах количество записей с нужным id.
Строю запрос, вроде считает, но именно вывод не правильно формирует.
SELECT t.id,t.master_theme, t.theme, COUNT(post.theme_id) as post_theme, COUNT(video.theme_id) as video_theme, COUNT(subscribe_theme.theme_id) as subscribe_theme 
FROM `theme` as t 
LEFT OUTER join post ON t.id = post.theme_id 
LEFT OUTER join video ON t.id = video.theme_id 
LEFT OUTER join subscribe_theme ON t.id = subscribe_theme.theme_id 
WHERE t.id in (88,14,91,23,79,13,21,24,89,17,65,35,97,82,37,38,85,64,56,90,60,99,16,76) 
GROUP BY t.id


Вывод:
5cde82efd45d4041023301.png

Суть в том, что в строке id=35 subscribe_theme по факту имеет только одну запись, а выводит две. ТО есть как будто копирует значение из post_theme.

Еще возникает странность, когда в subscribe_theme реально число строк 2
5cde83dc077f9738142310.png

ТО в общий вывод попадает уже 4:
5cde83fdad07d329597606.png
  • Вопрос задан
  • 152 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
JOIN - декартово умножение.
Одна строка из `theme`, к ней две из `post s`, ноль из `video` игнорируем (LEFT), одна из `subscribe`
Перемножаем, 1*2*1*1 = 2, что вы и получаете.
Если в `subscribe` будут две строки, получим 1*2*1*2 = 4
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
VladimirAndreev
@VladimirAndreev
php web dev
чтобы корректно работало, надо примерно так:

select
count(a.id) as all_a,
sum(ifnull(b.id, 0)) as all_b,
sum(ifnull(c.id, 0)) as all_c
from a left join b using(b_join) left join c using(c_join)
group by a.id
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы