3

3 つのテーブルがあります:
t_user (id, name) t_user_deal (id, user_id, deal_id) t_deal (id, title)

複数のユーザーを同じ取引にリンクできます。(私はオラクルを使用していますが、似ているはずです。適応させることができます)

彼が取引した一意のユーザーの数ですべてのユーザー (名前) を取得するにはどうすればよいですか?

いくつかのデータで説明しましょう:

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テーブルに2番目のユーザーを持っていることを参照しているように聞こえます。ここで説明したモデルにはそれが含まれていません。

于 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 に答える