根据其他元组中的条件省略元组

时间:2012-02-09 21:48:55

标签: sql oracle

我的数据库中有一张包含友谊记录的表格。表中有两列:user1_id和user2_id,表示user1是user2的朋友。它被设置为user1_id总是< user2_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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您可能还想考虑使用CONNECT BY clause,尽管这可能有点过分。