Autor | Zpráva | ||
---|---|---|---|
Kaifman Profil |
#1 · Zasláno: 1. 4. 2005, 21:43:14 · Upravil/a: Kaifman
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 |
#2 · Zasláno: 1. 4. 2005, 23:25:57
Zkus to ukázat na příkladu.
|
||
Kaifman Profil |
#3 · Zasláno: 1. 4. 2005, 23:34:41 · Upravil/a: Kaifman
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 |
#4 · Zasláno: 1. 4. 2005, 23:42:10
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 |
#5 · Zasláno: 2. 4. 2005, 21:55:29 · Upravil/a: Kaifman
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 |
#6 · Zasláno: 3. 4. 2005, 12:10:18
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 |
#7 · Zasláno: 3. 4. 2005, 18:01:07
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 |
#8 · Zasláno: 3. 4. 2005, 18:08:43
napadlo me pouzit operátor ALL kterej aplikuje relaci na všechny hodnoty vrácené poddotazem coz by mohlo byt resenim.
|
||
Kaifman Profil |
#9 · Zasláno: 3. 4. 2005, 18:20:30 · Upravil/a: Kaifman
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 |
#10 · Zasláno: 3. 4. 2005, 19:18:10
hmm tak to je blby mySQL tohle nepodporuje...pro vnoreny selekty podporuje jen IN a to nelze nijak porovnavat :-(
|
||
Časová prodleva: 19 let
|
Toto téma je uzamčeno. Odpověď nelze zaslat.
0