CREATE TABLE `hostsOnline` ( `id` int(11) NOT NULL AUTO_INCREMENT, `time` int(11) NOT NULL, `address` varchar(15) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=latin1 ;
w której trzymam aktywne hosty w sieci. Mam crona, który dodaje co minute tyle rekordów ile jest aktywnych hostów w sieci. Czyli przykładowe dane wyglądają tak
Kod
time | address
1 | 192.168.1.1
1 | 192.168.1.2
1 | 192.168.1.3
2 | 192.168.1.1
--time jest unixtimem
1 | 192.168.1.1
1 | 192.168.1.2
1 | 192.168.1.3
2 | 192.168.1.1
--time jest unixtimem
Potrzebuje zapytanie, które zwróci mi jako wiersze wszystkie unikalne wartości z address, a jako kolumny ilość wystąpień wszystkich, w bieżącym miesiącu, tygodniu, dzisiaj, i stan obecny.
Kombinowałem robić podselecty
SELECT ho.address, count(*) AS 'alltime', (SELECT count(*) FROM hostsOnline WHERE address = ho.address AND month(from_unixtime(time))=month(now()) AND year(from_unixtime(time)) = year(now())) AS 'thisMonth', (SELECT count(*) FROM hostsOnline WHERE address = ho.address AND week(from_unixtime(time))=week(now()) AND year(from_unixtime(time)) = year(now())) AS 'thisWeek' FROM hostsOnline ho GROUP BY ho.address
ale czas wykonania tego zapytania przy 110k rekordów jest niezbyt zadawalający, a w zapytaniu brakuje jeszcze kilku kolumn. Pytanie brzmi czy jest jakaś inna drogą aby wydobyć takie dane?