Re: Общие друзья (mutual friends)
От: gandjustas Россия http://blog.gandjustas.ru/
Дата: 06.10.10 18:50
Оценка:
Здравствуйте, Edain, Вы писали:

E>Всем привет. Помогите написать простой (я уверен в этом) запрос для MySQL.


E>Есть таблица graph. В ней два столбца — outV и inV. В таблице хранятся ребра графа, т.е. в каждом столбце — идентификатор вершины. Если между вершиной 0 и 1 есть ребро, то в таблице будет запись:


E>outV | inV

E>0 | 1
E>...
E>1 | 0

E>Теперь представим, что этот граф — социальная сеть: вершины — это люди, ребра — "дружба" между ними. Задача следующая: найти общих друзей у двух людей в этой социальной сети.

Сразу появляется неоднозначность. Отношение "дружественности" рефлексивно или нет?
То есть если 0 является другом 1, то является ли 1 другом 0 и будет ли еще одна запись в таблице? Или гарантируется инвариант что outV<inV (или наоборот, неважно).

E>Я вижу решение этой задачи в три этапа:

E>1. Находим всех друзей первого чела без второго (a — первый чел, b — второй)
E>Result1 = select inV from graph as g where g.outV = a and g.inV <> b;
E>2. Находим всех друзей второго чела без первого (a и b те же):
E>Result2 = select inV from graph as g where g.outV = b and g.inV <> a;
E>3. Найти общих друзей из результата первого и второго запросов (пересечение двух множеств):
E>Result1 intersect Result2;

E>Как это сделать одним запросом?


Ну собственно все три этапа можно записать одним запросом в СУБД, которая поддерживает оператор intersect (MS SQL например), а если не поддерживает, то пересечение множеств делается банальным join_ом.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.