在任何群体之间最关系?

时间:2013-05-26 11:40:40

标签: sql oracle group-by

我有3张桌子:

Create table users (
    id Number NOT NULL ,
        groupID Number NOT NULL ,
    name Varchar2(50),
primary key (id) 
);

Create table friends (
    friendID Number NOT NULL ,
    user_a Varchar2(35),
    user_b Varchar2(35),
primary key (friendID) 
);

Create table groups (
    groupID Number NOT NULL ,
    gname Varchar2(35),
primary key (groupID) 
);

Alter table users add  foreign key (groupID) references groups (groupID);

嵌入数据:

Users table
id | groupid | name
--------------------
1  |    1    |   s1
2  |    3    |   s2
3  |    2    |   s3
4  |    1    |   s4
5  |    2    |   s5

friends table
friendID | user_a | user_b
--------------------------
1        |   1    |   2
2        |   3    |   1
3        |   4    |   2
4        |   5    |   3
5        |   2    |   5

groups table 
groupid | groupname
--------------------
   1    |     in01
   2    |     in02
   3    |     in03

我想运行此查询:在任何群组之间的大多数关系?这是我当前的查询,但它不起作用

SELECT g.gname ,count(a.aname) as con
FROM users a
left join group g on g.groupid=a.groupid
left join friends f on f.user_a=a.id
group by con;

1 个答案:

答案 0 :(得分:1)

怎么样:

Select gname1, gname2, count(*) cnt
    from (
Select least(g1.gname, g2.gname) gname1,
         Greatest(g1.gname, g2.gname) gname2
   From friends f
   Join users u1 on f.user_a = u1.id
   Join users u2 on f.user_b = u2.id
   Join groups g1 on g1.groupid = u1.groupid
   Join groups g2 on g2.groupid = u2.groupid
) gc
Group by gname1, gname2
Order by count(*) desc

子查询中的最小和最大函数用于避免g1,g2和g2,g1的两个条目。

这将为您提供组间关系的计数。注意,如果您不希望始终添加where子句

,它将包括相同组之间的关系
 Where u1.groupid != u2.groupid