Autor Zpráva
Kaifman
Profil
hoj lidi, mám prosbu, mám tabulku a v ni sloupce pc (jednoznacne idantifikuje klienta), visit (1 nebo 0 coz mi rika jestli bzl pristup unikatni) a stamp (casovy unix razitko v sekundach). do niz se zaznamenava kazdy nacteni jakykoliv mereny stranky

Potreboval bych nejak sestavit SQL dotaz kterej by mi vytahl napriklad pocet uzivatelu kteri byli na merenejch strankach treba maximalne 60 sekund. Udelal jsem to takovym krkolomnym zpusebem ze nactu unikatni pristupy a pak ke kazdymu unikatnimu pristupu zjistuju posledni cas neunikatnich stranek stejnyho hashe, to sice funguje ale pokud bude mit nejakej web navstevnost treba 5000 visitu tak bude muset probehnout 5000 dotazu coz je dosti neefektivni. Vite nekdo jak na to?
thingwath
Profil
Zkus to ukázat na příkladu.
Kaifman
Profil
if ($hashs = $db->read_array ("select hash from id$id where visit = '1'"))
foreach ($hashs as $hash){
$stampfrom = $db->read_one ("select stamp from id$id where hash = '$hash'order by stamp limit 1");
$stampto = $db->read_one ("select stamp from id$id where hash = '$hash' order by stamp desc limit 1");
if (($stampto-$stampfrom) < 16) $pagestime15++;
elseif ((($stampto-$stampfrom) >15) and (($stampto-$stampfrom) < 31)) $pagestime1530++;
elseif ((($stampto-$stampfrom) >30) and (($stampto-$stampfrom) < 91)) $pagestime3090++;
elseif ((($stampto-$stampfrom) >90) and (($stampto-$stampfrom) < 181)) $pagestime90180++;
elseif ((($stampto-$stampfrom) >180) and (($stampto-$stampfrom) < 301)) $pagestime180300++;
elseif ((($stampto-$stampfrom) >300) and (($stampto-$stampfrom) < 601)) $pagestime300600++;
elseif ((($stampto-$stampfrom) >600) and (($stampto-$stampfrom) < 1200)) $pagestime6001200++;
else $pagestime1200++;
}
tímhle tim strasnym kodem si vlastne nactu unikatni pristupy a pak po jednom zjistuju jak dloho trval, a ja bzch potreboval abych to nacetl max 8 SQL dotazy , teda jednim na jedno casove rozmezi. ten kod je uplne strasnej mam na sebe nervy ze to nedokazu vymyslet jinak, urcite to nejak pude vnorenejma selektama nebo uz nevim
Kaifman
Profil
ten hash je vlastne hash retezec kterej identifikuje ten pocitac , je vytvorenej ze vsech udaju ktery se daj pres javascript a php ziskat o klientovi
Kaifman
Profil
mhmm asi sem to popsal moc komplikovaně tak to zkusim ještě jinak. Potřebuju sql dotaz kterej by mi vratil rozdil casu (stamp) v jenom radku minus - cas v jinym radku tabulky, pricemz jeden cas je nejvetsi hodnota a druhej je nejmensi hodnota, ja nevim pisu to asi jak de*il, potrebuju proste provest dve vyhledani a ty od sebe odecist a a vratit pocet tech vysledku, ktery budou splnovat urcitou podminku napriklad ze rozdil bude do 15 sekund ....uff uz nevim jak jinak to napsat :-)
thingwath
Profil
Hm, hele, já bych se na to kouknul, ale hodilo by se mi mít pár dat na kterých bych si to mohl zkoušet. Jakou máš databázi? Já tu mám teď jenom starou MySQL 3 a PostgreSQL 7.
Kaifman
Profil
mam mysql 4.0.23 ale budu to davat na 4.1ku, data si muzes lehce vygenerovat staci par radku tabulky

create table access (
id int(11) primary key auto_increment,
ip_adresa varchar(50) not null,
cas int(11) not null, // normalne je to destimistny unix cas ale pro zkouseni staci treba ctyrmistny
visit int(1) not null) // 1 unikatni, 0 neunikatni

insert into access values ('','10.20.30.40','1000','1');
insert into access values ('','10.20.30.40','1010','0');
insert into access values ('','10.20.30.40','1020','0');
insert into access values ('','10.20.30.40','1030','0');
insert into access values ('','10.20.30.40','1040','0');
insert into access values ('','20.30.40.50','1100','1');
insert into access values ('','20.30.40.50','1120','0');
insert into access values ('','20.30.40.50','1140','0');
insert into access values ('','20.30.40.50','1200','0');


tohle uplne staci... je tam cas prvniho pristupu i posledniho. takze napriklad pocet uzivatelu kteri stravili vic jak dvace vterin na strankach by mel vratit dva ale vic jak 50 uz jenom jeden
Kaifman
Profil
napadlo me pouzit operátor ALL kterej aplikuje relaci na všechny hodnoty vrácené poddotazem coz by mohlo byt resenim.
Kaifman
Profil
tak sem dostal nejakou muzu (to bude asi z toho litru zelenyho caje) a vyplodil tohle jen nevim jestli z toho ten server nebouchne :-D

select count(id) from access where
all (select cas from access where ip_adresa =
all (select distinct ip_adresa from access) order by cas desc limit 1) -
all (select cas from access where ip_adresa =
all (select distinct ip_adresa from access) order by cas limit 1) > 20

du to zkusit :-)
Kaifman
Profil
hmm tak to je blby mySQL tohle nepodporuje...pro vnoreny selekty podporuje jen IN a to nelze nijak porovnavat :-(
Toto téma je uzamčeno. Odpověď nelze zaslat.

0