Как одновременно посчитать и выбрать где в sql? - PullRequest
0 голосов
/ 10 марта 2019

У меня есть две таблицы user и group, а также usergroup в качестве таблицы ссылок, в которой указано, какие пользователи существуют в группе.

Чтобы выбрать группы, в которые входит конкретный пользователь, я могу просто сделать

SELECT * 
FROM usergroup 
INNER JOIN user 
ON user.id = group.user_id 
WHERE user.id = ?

Чтобы получить список usergroup записей, содержащих ссылку на user

Но как также одновременно получить количество других пользователей в том же group?

При выборе информации group я попробовал это

SELECT group.*, count(usergroup.*) group_count 
FROM usergroup 
INNER JOIN user 
ON user.id = group.user_id 
WHERE user.id = ? 

но всегда учитывается 1 (возможно, из-за фильтра WHERE user.id)

Ответы [ 3 ]

0 голосов
/ 10 марта 2019

Вам может понадобиться коррелированный подзапрос

drop table if exists u,ug;
create table u(id int);
create table ug (gid int,uid int);

insert into u values
(1),(2),(3);

insert into ug values
(1,1),(1,2),(1,3),
(2,2),(2,3),
(3,3);

select u.*,ug.gid,(select count(*) - 1 from ug ug1 where ug1.gid = ug.gid) others
from u
join ug on ug.uid = u.id;

+------+------+--------+
| id   | gid  | others |
+------+------+--------+
|    1 |    1 |      2 |
|    2 |    1 |      2 |
|    3 |    1 |      2 |
|    2 |    2 |      1 |
|    3 |    2 |      1 |
|    3 |    3 |      0 |
+------+------+--------+
6 rows in set (0.00 sec)
0 голосов
/ 10 марта 2019

Этот запрос:

select group_id from usergroup where user_id = 1

возвращает все группы, к которым принадлежит user_id = 1.Таким образом, вы можете использовать его в этом запросе:

select group_id, count(*) - 1 otherusers
from usergroup
where group_id in (
  select group_id from usergroup where user_id = 1
)
group by group_id

См. демо

0 голосов
/ 10 марта 2019

Если вы хотите посчитать размер групп, в которые входит пользователь 1, вы можете сделать:

select ug.group_id, count(*) as num_users
from usergroups ug 
group by ug.group_id
having sum( ug.user_id = 1 ) > 0;  -- has user 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...