【发布时间】: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,那将是微不足道的。