найти наиболее распространенное значение в нескольких таблицах - PullRequest
1 голос
/ 19 августа 2010

с учетом следующих таблиц, как мне найти наиболее распространенный 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, если это возможно. Спасибо и дайте мне знать, если вам нужно больше деталей.

Ответы [ 5 ]

6 голосов
/ 19 августа 2010

Извините, но другие ответы, использующие только union, а не union all, неверны.Если есть выбранная строка, которая появляется в более чем одной таблице, она будет учитываться только в первой таблице, если другие таблицы включены через объединение, а не объединение всех.адрес, возможность строки с одинаковым идентификатором и адресом в разных таблицах все еще существует.Использование 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
2 голосов
/ 19 августа 2010
 SELECT ip, count(*) c
 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)
 group by ip
 order by 2 desc
1 голос
/ 19 августа 2010

Энди, Вы можете использовать «объединение» для создания одной большой логической таблицы (в памяти) только с IP-адресами. Тогда вы можете сделать нормальный

select count(ip), ip from 
(select ip from table1 union all select ip from table2 etc) unionedTable 
group by ip

[отредактировано, чтобы добавить объединение всех - спасибо!]

1 голос
/ 19 августа 2010
       select ip, count(*) from
        (
        select id, ip from bad_guys_1
        union all
        select id, ip from bad_guys_2
        union all
        select id, ip from bad_guys_3
        union all
        select id, ip from bad_guys_4
        ) as ranking
        group by ip

order by count(*) desc 
1 голос
/ 19 августа 2010

Попробуйте это ...

select ip, count(*) 
from
(
select id, ip from bad_guys_1
union all
select id, ip from bad_guys_2
union all
select id, ip from bad_guys_3
union all
select id, ip from bad_guys_4
) a
group by ip
order by count(*) desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...