Ваш запрос нарушен и не будет работать во многих системах. Проблема состоит в том, что группа с user_id
из 2 имеет два разных значения: dev_id
. Если вы запустите «сломанный запрос» ниже, вы увидите, что min()
и max()
отличаются, но подзапрос видит только одно из тех значений, которое выбрано случайным образом. Последний запрос исправляется добавлением dev_id
в группы, которые показывают, где «недостающая» строка попала в подсчеты.
SELECT -- broken query
t1.user_id, min(t1.dev_id), max(t1.dev_id),
(select distinct t1.dev_id from reports) as should_have_errored,
(SELECT Count(DISTINCT t2.dev_id)
FROM reports t2
WHERE t2.user_id != t1.user_id
AND t2.dev_id = t1.dev_id
) AS qu
FROM reports t1
GROUP BY t1.user_id;
-- On SQL Server that query returns an error
-- Msg 8120, Level 16, State 1, Line 7
-- Column 'reports.dev_id' is invalid in the select list because it is
-- not contained in either an aggregate function or the GROUP BY clause.
SELECT -- query that duplicates your original query
t1.user_id,
(SELECT Count(DISTINCT t2.dev_id)
FROM reports t2
WHERE t2.user_id != t1.user_id
AND t2.dev_id = max(t1.dev_id) /* <-- see here */
) AS qu
FROM reports t1
GROUP BY t1.user_id;
SELECT t1.user_id, t1.dev_id, -- fixed query
(SELECT Count(DISTINCT t2.dev_id)
FROM reports t2
WHERE t2.user_id != t1.user_id
AND t2.dev_id = t1.dev_id
) AS qu
FROM reports t1
GROUP BY t1.user_id, t1.dev_id
http://sqlfiddle.com/#!9/6576e3/20
Вот некоторые вопросы, которые могут быть полезны:
Какие dev_id
s имеют несколько user_id
s, связанные с ними?
select dev_id
from reports
group by dev_id
having count(distinct user_id) > 1
Какие другие user_id
сек разделяют dev_id
с этим user_id
?
select user_id
from reports r1
where exists (
select 1
from reports r2
where r2.dev_id = r1.dev_id and r2.user_id <> ?
)
Или действительно это просто эквивалентно внутреннему соединению, что также позволяет легко перечислить всех сразу. Обратите внимание, что каждая пара будет в списке дважды:
select r1.user_id, r1.dev_id, r2.user_id as common_user_id
from
reports r1 inner join reports r2
on r2.dev_id = r1.dev_id
where
r1.user_id <> r2.user_id
order by
r1.user_id, r1.dev_id, r2.user_id
А поскольку у вас есть повторяющиеся строки в таблице вы должны сделать это select distinct
, чтобы получить уникальные строки.
Не работает правильно как? Что оно делает? – GolezTrol
Пожалуйста, уточните, что вы подразумеваете под «дублирующимися данными». –
У каждого пользователя должен быть один dev_id, но когда у другого пользователя будет такой же dev_id, я хочу знать это. – Karpol