给定下表,我将如何找到所有表中最常见的 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 |
例如,查询上面的表应该得到如下结果:
| 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 |
真实的表格实际上包含许多额外的字段,这些字段彼此不对齐,因此是分开的表格。我真的不在乎打破比赛之间的关系,只是按计数降序列出它们会很棒。如果使用任何非标准函数会有帮助,我的数据库是 PostGreSQL,但为了可移植性,如果可能的话,我更愿意使用标准 sql。谢谢,如果您需要更多详细信息,请告诉我。
最佳答案
很抱歉,其他仅使用 union
而不是 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
关于sql - 在多个表中找到最常见的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3522549/