2012-06-05 34 views
3

的號碼,我有3個表:
T_USER(ID,姓名) t_user_deal(ID,USER_ID,DEAL_ID) t_deal(ID,標題)查詢計數獨特的關係

多個用戶可以鏈接到同樣的交易。 (我使用的是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 

感謝您的幫助

回答

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 
+0

太謝謝你了。 – user1370289

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 

除非我在這裏失去了somethig。它實際上聽起來像你的問題引用在t_user_deal表中有第二個用戶。你在這裏描述的模型不包括那個。

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 ; 

的不同,這可能沒有必要(在COUNT(),就是)。取決於你的數據是乾淨的

這裏的結果PostgreSQL的(例如,沒有重複的行!):

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