Ik heb nu dus deze query staan om te hoeveel pagina's iemand bezoekt op een site tijdens een session:
SELECT log_remotehost, COUNT(log_id) AS path
FROM tblLog
WHERE log_sessionID IS NOT NULL and log_remotehost!=''
GROUP BY log_remotehost, log_sessionID
HAVING COUNT(log_id) > 1
ORDER BY path DESC, log_remotehost, log_sessionID
De simpelste vorm daarvan is iets als dit:
SELECT log_remotehost, COUNT(log_id) AS path
FROM tblLog
GROUP BY log_remotehost
En dat geeft mij dus per sessie van een remotehost het aantal log_id's. Om de zaken een beetje proper te houden heb ik er het volgende nog bijgezet:
De vraag is of dat eenvoudiger kan met een subquery. Laurens zegt:
Volgens mij is die group by onnodig, en als je die weglaat kun je er dan geen correlated subselect insteken die zoekt of eenzelfde log_remotehost bestaat? iets van:
SELECT L1.log_remotehost, L1.log_useragent, COUNT(L1.log_id) AS path
FROM tblLog L1,tblLog L2
WHERE (L1.log_sessionID IS NOT NULL AND COUNT(L1.log_id) > 1) OR
L1.log_remotehost IN (SELECT DISTINCT L2.log_remotehost FROM tblLog) ORDER BY path DESC, log_useragent, log_remotehost, log_sessionID DESC
Even mijn hoofd errond draaien. Wacht hé. Wat doet de query hierboven? Zoals hij er nu staat in ieder geval niet veel:
Server: Msg 147, Level 15, State 1, Line 3
An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.
Gr. Eerst eens kijken wat er eigenlijk uit mag. Useragent is niet nodig, en pak nu nog dat alle sessionID's ingevuld zijn. Dan mag log_useragent weg, en één van die voorwaarden in de WHERE. En in de ORDER BY mag path ook zeker weg. Dat geeft dus:
SELECT L1.log_remotehost, COUNT(L1.log_id) AS path
FROM tblLog L1,tblLog L2
WHERE (COUNT(L1.log_id) > 1) OR
L1.log_remotehost IN (SELECT DISTINCT L2.log_remotehost FROM tblLog) ORDER BY log_remotehost, log_sessionID DESC
Er is niets wezenlijks aan veranderd, en het geeft nog altijd dezelfde foutboodschap, da's dus wel goed. En nu eens zien wat er precies aan de hand is. Wat doet die query eigenlijk?
Ofwel is het te laat, ofwel begrijp ik er niets van, ofwel is er ergens iets fout: is het niet zo dat die FROM tblLog L1, tblLog L2 een cross join doet? En als er ergens count(ding) staat, moet dan niet aangegeven worden per wat er gecount moet worden? En is die subclause niet per definitie altijd waar (select x FROM tbl AS A WHERE x in (select distinct x from tbl as B))?
I dunno. Ik weet niet hoe veel dat van mij nog kan vereenvoudigd worden:
Misschien weet één van mijn fijne collega's of het echt nog eenvoudiger kan?
It's all in the timing

Hong Kong isn't too proud of the latest advertising campaign to draw tourists to the city. Being short of breath is one of the symptoms of SARS, which people are pretty likely to associate with the city now.
[Secular Blasphemy]Nog iets dat we nu weten: een <cfchart> mag niet meer dan 16 <cfchartseries> hebben, of de server ontploft.
't Is waar wat ze zeggen: Mozilla is een gemak om mee te ontwikkelen. Vooral voor histories als http headers en javascriptmiserie. Ze zouden al die dingen ook in Internet Explorer moeten steken!
Verdomme, er ligt een server uit, en ik krijg hem van hier niet herstart. Damned. Damned damned damned. Nog goed dat ik toevallig de stats aan het bekijken was. De java-applicatieserver ligt op zijn gat.
Alla. Wachten tot ER gedaan is, en dan aanzetten naar 't werk zeker? Bah.
Bruce Campbell speelt mee in Charmed!! Akkoord, Charmed sucked redelijk ass, maar Bruce Campbell rulet dan wel wel zwaar.
Stephen Malkmus & the Jicks: "Pig Lib". After a sub-par solo debut, Malkmus the Irreverent returns to form, effortlessly spanning the gap between quirky pop and hard rock. [Salon.com]
"Ik geef mijn bloed voor Ayatollah Hakim," het begint al in Irak. Cripes.
Of nog:
1452: Iraqi Shia Muslim leader Abdul Majid al-Khoei and another cleric are murdered in the central Iraqi town of Najaf. Mr al-Khoei - who returned to Iraq from exile earlier this week - was stabbed to death inside the Imam Ali mosque.
Bah. Het is inderdaad niet zo simpel.
Ik kan geen cookie zetten als ik niet meer dan een beeld smijt naar de gebruiker blijkbaar. Of ik zou de headers allemaal zelf moeten gaan maken misschien.
Bon, voorlopig lukt het wel om sessions en clients weg te schrijven, maar dan wel door ze in de url-variabelen van het beeld mee te geven.
En dus kan ik nu weten hoeveel pagina's de mensen in sites bekijken:
SELECT log_remotehost, log_useragent, COUNT(log_id) AS path
FROM tblLog tblLog
WHERE log_sessionID IS NOT NULL
GROUP BY log_useragent, log_remotehost, log_sessionID
HAVING COUNT(log_id) > 1
ORDER BY path DESC, log_useragent, log_remotehost, log_sessionID DESC
Dat geeft voor één van onze sites op een paar minuten dit:
| ncgent03.telenet-ops.be | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0; .NET CLR 1.0.3705) | 14 |
| MVUIJLST3 | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; (R1 1.3); .NET CLR 1.1.4322) | 9 |
| 218.14-200-80.adsl.skynet.be | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) | 7 |
| 114.39-200-80.adsl.skynet.be | Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) | 5 |
| LBLANCQU1 | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; (R1 1.3); .NET CLR 1.1.4322) | 5 |
| olympic1.axone.fr | Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0; Hotbar 4.2.8.0) | 4 |
| Candice-PP.cphs.wayne.edu | Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) | 3 |
| PROXY | Mozilla/4.0 (compatible; MSIE 5.0; Windows 98; DigExt) | 3 |
| dialin-246.dialin.unibas.ch | Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) | 3 |
| TPALKA.cphs.wayne.edu | Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0) | 3 |
| node06ea.vpt.adsl.euronet.nl | Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0) | 3 |
| www-cache1.unn.ac.uk | Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) | 3 |
| cim-18.medicina.ufmg.br | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 4.0) | 3 |
| khjivosa.vxu.se | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) | 3 |
| khjivosa.vxu.se | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0) | 3 |
| pool-141-156-141-39.res.east.verizon.net | Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; Hotbar 4.2.8.0; MSN 8.0; MSNbMSNI; MSNmen-us; MSNcIA) | 3 |
| ncgent03.telenet-ops.be | Mozilla/4.0 (compatible; MSIE 5.5; Windows 98) | 2 |
| pion.ext.extranet.xerox.com | Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 4.0; H010818) | 2 |
| ns1.prenhall.com | Mozilla/5.0 (Macintosh; U; PPC; en-US; rv:1.0.2) Gecko/20030208 Netscape/7.02 | 2 |
Dus niet helemaal sluitend: die khjivosa.vxu.se staat er twee keer in, en ikzelf (MVUIJLST3) ook twee keer. Grmbl.
En nu nog van die sessies en clients erin krijgen... Eigenlijk zou dat moeten eenvoudig zijn, maar ik heb zo'n gevoel dat het niet zo gemakkelijk is als het eruit ziet.
Tja, en als het er in zit, dan moet er nog eens duchtig gekeken worden naar de time-outs op al die dingen. En misschien houden we dan wel best één server dedicated voor alle statistieken, zo'n ding met genoeg geheugen en alles.
Proper schone, al zeg ik het zelf. Een klein statistiekprogrammaatje geschreven, het werkt gelijk een lierken.
Daarjuist een bijzonder vieze bug tegengekomen in ColdFusion. Tenminste, ik vind dat het een bug is.
<cfswitch expression="#a#">
<cfcase value="a"></cfcase>
<cfcase value="u"><cfset test=1></cfcase>
<cfcase value="v"><cfset test=2></cfcase>
<cfcase value="w"><cfset test=3></cfcase>
<cfcase value="x"><cfset test=4></cfcase>
<cfcase value="y"><cfset test=5></cfcase>
</cfswitch>
Dat geeft een null pointer exception op de case met "w". Ook als die verschoven wordt. Oplossing (na drie kwartier zoeken): de eerste case mag niet leeg zijn. Daar moet minstens een commentaar in staan. Zucht.

Nieuws & stuff Fark - Salon - BBC - Standaard - Slashdot
Mensen Graham - Bie - Neil G. - Rene - Iwein - Merel - Free - Steven - Bruno - Stijn
| April 2003 | ||||||
| Sun | Mon | Tue | Wed | Thu | Fri | Sat |
| 1 | 2 | 3 | 4 | 5 | ||
| 6 | 7 | 8 | 9 | 10 | 11 | 12 |
| 13 | 14 | 15 | 16 | 17 | 18 | 19 |
| 20 | 21 | 22 | 23 | 24 | 25 | 26 |
| 27 | 28 | 29 | 30 | |||
| Mar May | ||||||