查询计算唯一关系的数量

时间:2012-06-05 17:53:35

标签: sql oracle

我有3张桌子:
    t_user(id,name)     t_user_deal(id,user_id,deal_id)     t_deal(id,title)

多个用户可以链接到同一笔交易。 (我正在使用oracle但它应该是相似的,我可以适应它)

如何让所有用户(姓名)获得与他达成交易的唯一身份用户的数量。

让我们解释一些数据:

t_user:
id, name
1, joe
2, mike
3, John

t_deal:
id, title
1, deal number 1
2, deal number 2

t_user_deal:
id, user_id, deal_id
1, 1, 1
2, 2, 1
3, 1, 2
4, 3, 2

我期望的结果:     user_name,他处理的唯一用户的数量     乔,2     迈克,1     约翰,1

我试过这个,但我没有得到预期的结果:

SELECT tu.name,
    count(tu.id) AS nbRelations
FROM t_user tu
INNER JOIN t_user_deal tud ON tu.id = tud.user_id 
INNER JOIN t_deal td ON tud.deal_id = td.id 
WHERE 
(
    td.id IN 
    (
      SELECT DISTINCT td.id 
      FROM t_user_deal tud2 
      INNER JOIN t_deal td2 ON tud2.deal_id = td2.id 
      WHERE tud.id <> tud2.user_id
    )
) 
GROUP BY tu.id
ORDER BY nbRelations DESC

感谢您的帮助

3 个答案:

答案 0 :(得分:1)

这应该可以得到结果

     SELECT id1, count(id2),name
     FROM ( 
            SELECT distinct tud1.user_id id1 , tud2.user_id id2
            FROM t_user_deal tud1, t_user_deal tud2 
            WHERE tud1.deal_id = tud2.deal_id
            and tud1.user_id <> tud2.user_id) as tab, t_user tu
     WHERE tu.id = id1 
     GROUP BY id1,name

答案 1 :(得分:0)

这样的东西
select name, NVL (i.ud, 0) ud from t_user join (
SELECT user_id, count(*) ud from t_user_deal group by user_id) i on on t_user.id = i.user_id
where i.ud > 0

除非我在这里错过了一些东西。它实际上听起来像你的问题引用在t_user_deal表中有第二个用户。您在此处描述的模型并未包含该模型。

答案 2 :(得分:0)

PostgreSQL示例:

create table t_user (id int, name varchar(255)) ;
create table t_deal (id int, title varchar(255)) ;
create table t_user_deal (id int, user_id int, deal_id int) ;

insert into t_user values (1, 'joe'), (2, 'mike'), (3, 'john') ;
insert into t_deal values (1, 'deal 1'), (2, 'deal 2') ;
insert into t_user_deal values (1, 1, 1), (2, 2, 1), (3, 1, 2), (4, 3, 2) ;

和查询.....

SELECT
  name, COUNT(DISTINCT deal_id)
FROM
  t_user INNER JOIN t_user_deal ON (t_user.id = t_user_deal.user_id)
GROUP BY
  user_id, name ;

可能没有必要使用DISTINCT(在COUNT()中)。取决于您的数据有多干净(例如,没有重复的行!)

这是PostgreSQL中的结果:

 name | count 
------+-------
 joe  |     2
 mike |     1
 john |     1
(3 rows)