如何查找重复的条目,但首先按列分组,然后计数并显示它

时间:2017-08-14 18:12:23

标签: mysql

你好我无法解决这个问题。我有一个包含用户条目和ips的表。我的目标是找到具有相同IP的用户1和用户2。

user_id    | IP
1003       | 1.1.1.1
1003       | 1.1.1.1
1003       | 2.2.2.2
1004       | 1.1.1.1
1004       | 3.3.3.3      
1005       | 4.4.4.4
1005       | 5.5.5.5

我想要的是这个

user_id    | same_ip_count
1003       | 2
1004       | 2

在这里你看到1003和1004显示2,因为两者至少有一次相同的ip。

我唯一能得到的就是向我展示拥有多个用户的所有IPS。

SELECT 
    ip, COUNT(distinct user_id) as used_by_user_count 
FROM 
    user_entry 
WHERE 
    ip != ''
GROUP BY 
    ip
HAVING 
    used_by_user_count > 1

这是结果

ip         | used_by_user_count
1.1.1.1    | 2

但我无法使用user_id代替ips。然后我尝试了子查询(猜测一点点),但我失败了。我希望你能帮助我。

编辑:我做了快速的sqlfiddle http://sqlfiddle.com/#!9/0f8f04/4

3 个答案:

答案 0 :(得分:2)

我会从每一行自我加入到具有相同ip但具有不同用户的任何其他行。通过使用内部联接,这自然只能找到有多个用户的情况。因此,添加一个来计算第一个用户a

select a.user_id, count(distinct b.user_id)+1 as count 
from user_entry as a 
join user_entry as b on a.ip = b.ip and a.user_id <> b.user_id 
group by a.user_id;

+---------+-------+
| user_id | count |
+---------+-------+
|    1002 |     2 |
|    1001 |     2 |
+---------+-------+

答案 1 :(得分:1)

如果格式不重要,您可以使用GROUP_CONCAT列出共享相同IP的所有用户:

SELECT 
    ip,
    COUNT(distinct user_id) as used_by_user_count,
    GROUP_CONCAT(distinct user_id) as user_ids
FROM user_entry 
WHERE ip != ''
GROUP BY ip
HAVING used_by_user_count > 1;

结果将是:

|      ip | used_by_user_count |  user_ids |
|---------|--------------------|-----------|
| 1.1.1.1 |                  2 | 1003,1004 |

答案 2 :(得分:0)

让用户获得更多的ip,你可以使用count(不同的ip)

  select user_id, count(distinct ip)
  from user_entry
  group by user_id
  having count(distinct ip) > 1

和 为了获得具有相同IP的用户,您可以使用

select a.ip, a.user_id 
   from user_entry a 
   inner join (
      select ip, count(distinct user_id)
      from user_entry
      group by ip
      having count(distinct user_id) > 1
) t on t.ip  = a.ip