выборка адресов с подсчетом

InventOR^ULG

Новичок
выборка адресов с подсчетом

Подскажите как можно реализовать следующую комбинацию:
база:
create table spamers (id int(7) auto_increment,
adr varchar(15) default '0.0.0.0',
blocked int(12) default '0',
lastdate int(12) default '0')

записи вида:
1,'64.71.155.162','0','0'
2,'64.71.155.120','0','0'
3,'64.74.153.12','0','0'
4,'67.103.254.32','0','0'

вопрос: можно ли реализовать одним запросом выборку в виде:
adr - сам адрес, если есть адреса в которых первые 3 группы совпадают, то адрес должен иметь вид x.x.x.0)
count(adr - сколько совпадает адресов по первым 3-м группам)
min(blocked - мин. дата(timestamp) когда был адрес блокирован, если это группа адресов - то мин. в группе)
max(lastdate - макс. дата(timestamp) когда адрес был блокирован, если это группа адресов - то мин. в группе)

как можно это реализовать? mysql 3.23.52.
 

.des.

Поставил пиво кому надо ;-)
PHP:
SELECT 
    IF( count(*)=1, 
              adr, 
              CONCAT(SUBSTRING_INDEX(adr,'.',3),'.0')
        ) AS adr_group, 
    COUNT(*) AS cnt,  MIN(blocked) AS minb, MAX(lastdate) AS maxl

FROM spamers
GROUP BY SUBSTRING_INDEX(adr,'.',3);
Общую сумму сразу всех адресов совпадающих по первым трем группам он не покажет.. он показывает только количество совпадающих адресов в каждой из групп (все остальное, что требовалось он выведет).
Если все таки общая сумма нужна то делается это отдельным запросом из результатов этого.
 

InventOR^ULG

Новичок
нет. нужно чтобы получилось типа:
'64.71.155.0',2,'0','0'
'64.74.153.12',1,'0','0'
'67.103.254.32',1,'0','0'
 

.des.

Поставил пиво кому надо ;-)
Именно это и получается.. ты просто скобку закрой..
 

ttt_ttt

Guest
select adr, count(id), min(blocked), max(lastdate) from spamers group by substring_index(adr, '.', 3);

а замена на x.x.x.0 критична?
может лучше в пхп если count() > 1 заменить вручную?
 

.des.

Поставил пиво кому надо ;-)
ttt_ttt а чем отличается твой запрос от приведенного выше ? :)

А в пхп ничего делать не стоит, если можно это сделать муськой.
 
Сверху