如何找出一对多条目

How to find out 1-to-many entry

有一个假设是一对一映射的数据集。 例如,

userId, deviceId
aaa, 12345
bbb, 22398
ccc, 43284

但是,有一种情况是一个deviceId有多个userId。

userId, deviceId
ddd, 12094
eee, 12094
fff, 12094
ggg, 459834
hhh, 459834
iii, 459834
jjj, 459834

什么SQL只能列出那些一对多的条目? 想象一下,有很多一对多条目。结果中不需要一对一的条目。所以,我想看到的结果是,

deviceId, _cnt
12094, 3
459834, 4

您好,您可以计数,然后筛选出计数大于 1 的那些:

SELECT deviceId
       , COUNT(DISTINCT userId) AS uct
       , COUNT(userId) AS ct
  FROM table
 GROUP BY deviceId
HAVING ct > 1 
   AND uct > 1

最好使用列名而不是计数 (*)。在大数据集的情况下,它也会提高性能。

SELECT deviceId, 
COUNT(userId) AS user_count
FROM table
GROUP BY deviceId
HAVING COUNT(userId)> 1

一个简单的计数就可以了:

select deviceId, count(*) _cnt
from mytable
group by 1
having count(*) > 1

要列出不是 1-1 的所有条目:

select userId, deviceId
from mytable
where deviceId in (
    select deviceId
    from mytable
    group by 1
    having count(*) > 1
)

或者

select distinct a.userId, b.deviceId
from mytable a
join mytable b on b.deviceId = a.deviceId
    and b.userId != a.deviceId