给出下面的表格,我将如何在所有表中找到最常见的IP地址,理想情况下,在所有表中发生ip的次数.
bad_guys_1 bad_guys_2
| id | ip | | id | ip |
+----+---------+ +----+---------+
| 1 | 1.2.3.4 | | 1 | 1.2.3.4 |
| 2 | 2.3.4.5 | | 2 | 4.5.6.7 |
| 3 | 3.4.5.6 | | 3 | 1.2.3.4 |
bad_guys_3 bad_guys_4
| id | ip | | id | ip |
+----+---------+ +----+---------+
| 1 | 9.8.7.6 | | 1 | 1.2.3.4 |
| 2 | 8.7.6.5 | | 2 | 2.3.4.5 |
| 3 | 2.3.4.5 | | 3 | 3.4.5.6 |
Run Code Online (Sandbox Code Playgroud)
例如,查询上面的表应该会导致类似于:
| ip | count |
+---------+-------+
| 1.2.3.4 | 4 |
| 2.3.4.5 | 3 |
| 3.4.5.6 | 2 |
| 4.5.6.7 | 1 |
| 9.8.7.6 | 1 |
| 8.7.6.5 | 1 |
Run Code Online (Sandbox Code Playgroud)
实际表格实际上包含许多不相互排列的附加字段,因此是单独的表格.我并不真正关心打破比赛之间的关系,只需按照降序列出它们就会很棒.我的数据库是PostGreSQL,如果使用任何非标准函数将有所帮助,但是为了便携性,如果可能的话,更愿意使用标准的sql.谢谢,如果您需要更多细节,请告诉我.
很抱歉,但是使用just union和not 的其他答案union all都是错误的.如果有一个选定的行出现在多个表中,则只有在其他表通过union而不是union all包含时才会在第一个表中计算.
对于那些同时选择ID和地址的查询,仍然存在在不同表中具有相同ID和地址的行的可能性.使用UNION ALL可确保所有值都已联合,无论它们是否重复 - 我们需要重复项以便对它们进行计数.使用UNION ALL通常对数据库的工作量较少,因为它不需要查找重复项并删除它们.
select ip, count(*) from
(
select ip from bad_guys_1
union ALL
select ip from bad_guys_2
union ALL
select ip from bad_guys_3
union ALL
select ip from bad_guys_4
) as ranking
group by ip
order by count(*) DESC
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2348 次 |
| 最近记录: |