Получить счетчик отношений «многие ко многим» на двух уровнях в одном запросе - PullRequest
0 голосов
/ 30 марта 2020

Я получаю список друзей определенного пользователя, использующего этот запрос.

SELECT users.* from users 
      inner join friends ON user_id = id OR user_id2 = id
      WHERE (user_id = 33 OR user_id2 = 33) AND id != 33

    GROUP BY user_id, user_id2, id

Теперь я хочу включить количество друзей каждого пользователя в одном запросе

Как Могу ли я это сделать?

Это похоже на дубликат, но я не мог применить другие ответы к моей проблеме. Помощь высоко ценится.

Это схема базы данных

create table if not exists users (
      id serial primary key,
      phone_number text,
      cin text,
      name text,
      positive_date timestamp,
      address text,
      created_at timestamp default now()
    );

create table if not exists friends (
      user_id integer not null references users,
      user_id2 integer not null references users,
      created_at timestamp default now(),
      distance integer
    );

И пара операторов вставки, чтобы попробовать вещи

INSERT INTO users (id, phone_number, cin, name, positive_date, address, created_at) VALUES (20, '0306200503', 'k26jx2dx', 'Mathis Gerard', NULL, '2222 Dubois de Provence Suite 117', '2020-03-30 08:31:42.674733');
INSERT INTO users (id, phone_number, cin, name, positive_date, address, created_at) VALUES (21, '0306200503', 'k26jx2dx', 'Mathis Gerard', NULL, '2222 Dubois de Provence Suite 117', '2020-03-30 08:31:42.674733');

INSERT INTO friends (user_id, user_id2, created_at, distance) VALUES (20, 21, '2020-06-05 17:23:00.635', 2);

И вот изображение, объясняющее вещи более подробно: enter image description here

В результате запроса Get friends of user 1 and their number of friends будет возвращено следующее:

- 2: id, name ... + count = 2
- 3: id, name ... + count = 1

1 Ответ

1 голос
/ 30 марта 2020

Если вы просто хотите количество друзей, как насчет подзапроса:

select u.*,
       (select count(*)
        from friends f
        where u.id in (f.user_id, f.user_id2)
       )
from users u
where id = 33;

Я был бы удивлен, если бы кто-то мог подружиться с собой. Если это так, вы можете добавить f.user_id <> f.user_id2 в подзапрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...