3

我有 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,他与 Joe 达成交易的唯一用户数,2 Mike,1 John,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

感谢您的帮助

4

3 回答 3

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
于 2012-06-05T18:19:08.853 回答
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 表中有第二个用户。您在此处描述的模型不包括该模型。

于 2012-06-05T18:10:26.653 回答
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)
于 2012-06-05T18:30:44.063 回答