опускание кортежей в зависимости от условий в других кортежах - PullRequest
1 голос
/ 10 февраля 2012

В моей базе данных есть таблица, содержащая записи о дружбе.В таблице есть два столбца: user1_id и user2_id, указывающие, что user1 дружит с user2.Он настроен так, что user1_id всегда

SELECT af.1, bf.1, count(*) as count
FROM (SELECT *
      FROM friends
      UNION
      SELECT user2_id, user1_id
      FROM friends ) af,
     (SELECT *
      FROM friends
      UNION
      SELECT user2_id, user1_id
      FROM friends ) bf
WHERE af.1 != bf.1 
AND af.2 = bf.2
GROUP BY af.1, bf.1
ORDER BY count desc

Это должно дать мне все комбинации пользователей, отсортированных по тем, у кого самые общие друзьяТем не менее, он не пропускает кортежи, содержащие пары, которые на самом деле сами являются друзьями.Я могу сделать это в Java, но я бы предпочел сделать это на стороне базы данных.Есть ли хороший способ сделать это?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012
SELECT af.1, bf.1, count(*) as count
FROM (SELECT *
      FROM friends
      UNION
      SELECT user2_id, user1_id
      FROM friends ) af,
     (SELECT *
      FROM friends
      UNION
      SELECT user2_id, user1_id
      FROM friends ) bf
WHERE af.1 != bf.1 
AND af.2 = bf.2
AND NOT EXISTS (SELECT 1
                FROM friends
                WHERE user1_id = af.1 AND user2_id = bf.1
                OR user1_id = bf.1 AND user2_id = af.1)
GROUP BY af.1, bf.1
ORDER BY count desc
0 голосов
/ 11 февраля 2012

Вы также можете рассмотреть возможность использования условия CONNECT BY , хотя это может быть излишним.

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