2012-06-05 5 views
3

У меня есть 3 таблицы:
t_user (идентификатор, имя) t_user_deal (идентификатор, user_id, deal_id) t_deal (идентификатор, название)запрос для подсчета количества уникальных отношений

нескольких пользователей может быть связано с такой же сделка. (Я использую 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) 
Смежные вопросы