Найти дубликаты в столбце SQL - PullRequest
0 голосов
/ 11 февраля 2019

У меня есть эта таблица с именем log:

ID   User_ID   Machine_Number   Email 
1     100         12345          jim@gmail.com
2     100         12345          jim@gmail.com
3     101         67890          bill@gmail.com
4     102         12345          steve@gmail.com

Мне нужно найти идентификаторы User_ID пользователей с одинаковым номером Machine_Number.В этом случае мне нужен запрос, который возвращает 100 и 102.

Я пробовал:

SELECT user_id, COUNT(machine_number) 
FROM log
GROUP BY machine_number
HAVING COUNT(machine_number) > 1

, но это дает счетчик каждого вхождения machine_number, то есть User_ID Count (machine_number)

100          2
101          1
102          1

Есть предложения?

Ответы [ 6 ]

0 голосов
/ 11 февраля 2019
Select DISTINCT M.User_Id, M.Machine_NUmber from Machine M  
Inner Join (Select M1.Machine_NUmber from Machine M1 Group By M1.Machine_NUmber Having COUNT(M1.Machine_NUmber)>1) M2 
On M.Machine_NUmber = M2.Machine_NUmber
0 голосов
/ 11 февраля 2019

код ниже в синтаксисе MS SQL, но я думаю, что он будет хорошо работать в MYSQL.

 SELECT DISTINCT t1.User_ID FROM log t1 
    INNER JOIN 
     (
    SELECT l.Machine_Number,count(DISTINCT l.User_ID)Count FROM log l
    GROUP BY l.Machine_Number
    )t2
    ON 
    t1.Machine_Number =t2.Machine_Number
    WHERE t2.Count>1
0 голосов
/ 11 февраля 2019
SELECT user_id,Machine_Number 
FROM log where Machine_Number IN 
     (SELECT Machine_Number FROM log GROUP BY Machine_Number HAVING count(1) > 1) 
ORDER BY Machine_Number;

А если вы хотите отдельный user_id, используйте ниже.

SELECT distinct user_id, Machine_Number
FROM log where Machine_Number IN
(SELECT Machine_Number FROM log GROUP BY Machine_Number HAVING count(1) > 1) 
ORDER BY Machine_Number;
0 голосов
/ 11 февраля 2019

использование существует

select distinct t1.* from log t1 where exists
( select 1 from log t2 where t1.machine_number=t2.machine_number
 group by machine_number having count(*)>1
)
0 голосов
/ 11 февраля 2019

Полагаю, вы хотите получить оба user_id для одной и той же машины.Попробуйте group_concate:

SELECT group_concat(DISTINCT user_id), machine_number
FROM log
GROUP BY machine_number
HAVING COUNT(machine_number) > 1
0 голосов
/ 11 февраля 2019

Полагаю, вы имеете в виду разное использование с одной и той же машиной.Вы можете использовать exists вот так, чтобы получить исходные строки:

select l.*
from log l
where exists (select 1
              from log l2 
              where l2.machine_number = l.machine_number and l2.email <> l.email
             );

Это должно иметь очень хорошую производительность, особенно с индексом (machine_number, email).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...