我有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
感谢您的帮助
答案 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)