在多个表中查找最常见的值

1 sql postgresql

给出下面的表格,我将如何在所有表中找到最常见的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.谢谢,如果您需要更多细节,请告诉我.

mdm*_*dma 6

很抱歉,但是使用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)