Это запрос ActiveRecord, который выполняет поиск в моей таблице "site_access_log", состоящей из веб-доступа к сайту.
Он выбирает поле 'remote_addr' из первых 15 записей вместе со счетчиком для этого IP-адреса, отсортированным в порядке убывания по количеству, за которым следует порядковый номер в порядке возрастания для номеров IP с одинаковым номером счетчика.
Я использую Postgres, который понимает числа IPv4, поэтому я приведу поле к типу inet
, чтобы разрешить правильную сортировку по значению, а не по значению ASCII. Если ваша база данных не поддерживает значения inet, вы всегда можете преобразовать IP в inet, используя библиотеку Ruby Socket или IPSocket, а затем отсортировать полученные результаты.
@remote_addr_results = SiteAccessLog.all(
:select => 'remote_addr, count(remote_addr) as remote_addr_count',
:group => :remote_addr,
:order => 'remote_addr_count desc, cast(remote_addr as inet)',
:limit => 15
)
puts @remote_addr_results.map{ |r| r.remote_addr_count << ' : ' << r.remote_addr }
>> 985 : 68.228.61.183
>> 572 : 205.203.134.197
>> 500 : 68.32.220.153
>> 460 : 72.200.64.128
>> 281 : 24.121.196.194
>> 262 : 99.91.9.155
>> 241 : 68.99.237.178
>> 213 : 68.99.119.137
>> 208 : 70.167.157.162
>> 204 : 201.165.6.2
>> 164 : 72.201.233.147
>> 155 : 75.245.177.106
>> 150 : 97.123.246.154
>> 149 : 201.165.190.98
>> 145 : 74.37.165.220
Сгенерированный SQL выглядит так:
SELECT remote_addr, count(remote_addr) as remote_addr_count
FROM "site_access_logs"
GROUP BY remote_addr
ORDER BY remote_addr_count desc, cast(remote_addr as inet)
LIMIT 15