Здравствуйте, 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_ом.