@filippovanatoliy
Вот начал погружаться в кодинг)

Почему join еще одной таблицы изменяет мой count?

Привет! Третий день сижу ломаю голову, не пойму в чем подвох.

Есть три таблицы:
salons_groups_link
users_groups_link
salons_groups

В первой просто связка сетей / филиалов вида salon_id | group_id
Во второй пользователи сети в формате user_id | group_id
важно - один юзер может быть во многих group_id
В третьей - просто список всех сетей

Мне нужно получить ид сети, название сети, сколько филиалов входит в эту сеть, сколько пользователей входит в эту сеть

Казалось бы, в чем тут проблема? Количество филиалов из сети я получаю как count(sl.salon_id) ... group by sl.group_id
но как только я добавляю в выборку таблицу с пользователями, записей становится больше, и весь мой count едет.

select sg.id, count(sl.salon_id) as "Количество филиалов"
from salons_groups sg
    inner join salons_groups_link sl on sg.id = sl.group_id
         where sg.id in (
            select group_id from salons_groups_link where salon_id = 4564)
group by sl.group_id


дает мне все что я бы хотел
eb8a596978.jpg

, но как только я добавляю таблицу с пользователями, все ломается:

select sg.id, count(sl.salon_id) as "Количество филиалов", count(u.user_id)
from salons_groups sg
    inner join users_groups_link u on u.group_id = sg.id
    inner join salons_groups_link sl on sg.id = sl.group_id
         where sg.id in (
            select group_id from salons_groups_link where salon_id = 4564)
group by sl.group_id


ef3b553d76.jpg

Я пошел другим путем, сначала найдя всех пользователей сети, а потом к этой же выборке цеплять другие таблицы. Пришел к тому же самому. Понимаю, что где-то фундаментально я не прав, а где не пойму
  • Вопрос задан
  • 90 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
JOIN - это декартово произведение таблиц. При отсутствии фильтра ON число строк результата JOIN'а будет равняться произведению числа строк таблиц, входящих в JOIN.
В вашем случае, если в users_groups_link есть несколько строк с одним group_id, то в результате JOIN'а для каждой из них будет создана отдельная строка результата.
Побороть можно, например, используя count(DISTINCT sl.salon_id).
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы