2012-05-25 4 views
0

для моей домашней работы У меня есть следующая задача: У меня есть простая база данных, которая похожа на facebook с друзьями и их отношениями. Теперь мне нужно подсчитать количество прямых друзей и количество друзей прямых друзей.Сохранение результатов в переменной в plpgsql

Так что мой подход был: Выбор всех прямых друзей и сохранение их идентификаторов в переменной. Затем я перебираю эти идентификаторы и сохраняю всех прямых друзей текущего пользователя в другой переменной. (Для каждого в том же). В конце концов, у меня есть большой массив с alle связанным идентификатором пользователя. Тогда мне просто нужно выбрать отдельный идентификатор и посчитать их.

Моя проблема: Как сохранить идентификатор в переменной (array?), Чтобы я мог легко пересечь их и, в конце концов, сделать отдельный выбор идентификатора?

Надеется, что вы можете дать мне намек на что ...

ответ

3

Если назначение не требует использования plpgsql, она может быть решена более легко с простым SQL.

Учитывая эту таблицу (который вы должны были поставки):

CREATE TEMP TABLE f (
    friend_of int 
    ,friend_with int 
    ,PRIMARY KEY (friend_of, friend_with) 
); 

Сколько друзей делает пользователь 1 есть?

SELECT count(*) As friends 
FROM f 
WHERE friend_of = 1; 

Сколько уникальных друзей делают друзья пользователя 1 (кроме пользователя 1)?

SELECT count(DISTINCT f2.friend_with) - 1 AS friends_friends -- minus himself 
FROM f f1 
JOIN f f2 ON f2.friend_of = f1.friend_with 
WHERE f1.friend_of = 1; 

Без DISTINCT общих друзей будет учитываться несколько раз.
Demo on sqlfiddle.

Смежные вопросы