你好我无法解决这个问题。我有一个包含用户条目和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答案 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