【问题标题】:omitting tuples based on conditions in other tuples根据其他元组中的条件省略元组
【发布时间】:2012-02-09 21:48:54
【问题描述】:

我的数据库中有一张包含友谊记录的表。表中有两列: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来做,但我更喜欢在数据库端做。有什么好办法吗?

【问题讨论】:

  • 哪个 DBMS? (Oracle、MySQL、SQL Server、PostgreSQL?)如果不错,可以使用MINUS
  • Oracle,但我不知道设置差异对我有什么帮助。我试图首先找到谁拥有最多的共同朋友,然后省略已经彼此成为朋友的元组。
  • 嗯。是的,我猜COUNT(*) 字段的存在使得MINUS 很难使用。如果您选择af.1, bf.1,那将是微不足道的。

标签: sql oracle


【解决方案1】:
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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2019-01-28
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2020-12-13
      • 1970-01-01
      • 2019-08-03
      • 2022-12-18
      相关资源
      最近更新 更多