Запрос соединения с 3 таблицами

У меня есть 3 таблицы в mysql:

t_group:

id | groupid
--------------
1    group1      
2    group2

t_user:

id | userid | groupid
----------------------
1    user1    group1  
2    user2    group1
3    user3    group2
4    user4    group2
5    user5    group2

t_order:

id | orderid | userid
---------------------
1    order1    user1      
2    order2    user2
3    order3    user2
4    order4    user4

Мне нравится получать количество пользователей и количество заказов по группам. Мой запрос выглядит следующим образом:

SELECT t_group.groupid, COUNT(t_user.id) as num_user, COUNT(t_order.userid) as num_order
FROM `t_group` 
left join t_user on t_group.groupid=t_user.groupid
left join t_order on t_order.userid=t_user.userid
GROUP by t_group.groupid

Но я получил странный результат:

------------------------------
groupid | num_user | num_order
------------------------------
group1    3          3 
group2    3          1  

Фактическое количество пользователей в группе 1 равно 2, но отображается 3. Разве нельзя получить желаемый результат в одном запросе на соединение?

COUNT(t_order.userid) as num_order Правда?

Sergey 21.03.2022 16:07

Также укажите ожидаемый результат.

jarlh 21.03.2022 16:16

Отвечает ли это на ваш вопрос? Два SQL LEFT JOINS дают неверный результат

philipxy 22.03.2022 01:43
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
3
36
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

попробуйте с внутренним соединением:

SELECT t_group.groupid, COUNT(t_user.id) as num_user, COUNT(t_order.userid) as num_order FROM `t_group` 
INNER JOIN t_user ON t_group.groupid=t_user.groupid
INNER JOIN t_order ON t_order.userid=t_user.userid
GROUP by t_group.groupid
Ответ принят как подходящий

Вы можете попробовать этот подход для достижения желаемого результата:

select temp1.groupid,temp1.count_user,temp2.count_order from 
  (select count(distinct (u.userid)) count_user, u.groupid
   from t_group g
   inner join t_user u on u.groupid= g.groupid
   group by u.groupid
  ) temp1
left join
  (select count(distinct (o.orderid))count_order, u.groupid
  from t_group g
  inner join t_user u on u.groupid= g.groupid
  inner join t_order o on u.userid = o.userid 
  group by u.groupid
  ) temp2
on temp1.groupid= temp2.groupid
order by temp1.groupid;

БД рабочий пример

Отлично!.. Работает отлично! и большое спасибо за ваш добрый пример в скрипте БД.

user1942626 22.03.2022 00:45

Другие вопросы по теме