Hi,
Ik zit op dit moment met een query waar ik echt even niet uitkom. Via de search had ik al het een en ander gevonden, maar toch krijg ik het niet werkend.
Het probleem
In mijn statistieken systeem archief/verwerk ik rauwe gegevens naar iets wat het een en ander kan zeggen. Eerst deed ik dit gehele verwerken in PHP, maar op dit moment heb ik al heel veel geport naar C++, wat qua snelheid al het een en ander verbeterd heeft.
Mijn streven is vooral om zo veel mogelijk alles direct in queries te doen, zonder dat er dus nog een applicatie laag tussen zit die dingen afhandeld. Nu heb ik echter een query nodig waar ik dus niet uitkom, wat er moet gebeuren is aardig eenvoudig. Even versimpelt weergegeven:
* Er is een tabel 'stats' met veel gegevens, waaronder de entrypageid. Dit is de id van de pagina waar de bezoeker op binnenkwam.
* Er is date field in deze tabel, wat aangeeft wanneer de bezoeker langskwam.
* Er is een tabel 'archive' waarin alle dates (per dag dus een!) sinds de start van de telling tot nu als date field opgeslagen zijn.
Nu wil ik per dag bijvoorbeeld de top 30 van de entrypageid's hebben. Dus per dag een lijst van 30 id's van hoog naar laag, op pagina 1 kwamen bijv 10 bezoekers, op pagina 2 maar 8, op pagina 3 slechts 7.. etc.
Echter krijg ik dit dus niet voor elkaar, en zit hier al enkele uren mee te klooien. Per dag een query is niet de bedoeling: Dit zou nu al 1000 queries zijn. Nu worden de statistieken natuurlijk niet elke keer vanaf het start punt verwerkt... maar toch zou ik dit graag goed hebben. Het zou dan toch ook gewoon mogelijk moeten zijn?
Per dag zou het zo zijn:
Ik heb al zitten experimenteren met temporary tables, sub queries en full outer joins, maar ik loop steeds tegen iets aan waardoor het gewoon niet goed gaat, of alleen de eerste dag, etc. Ik heb helaas al die queries niet meer omdat ik een query had geschreven die dependable was, en nogal hard gestopt moest worden
.
Dus misschien dat iemand hier die een goede suggestie heeft?
Ik zit op dit moment met een query waar ik echt even niet uitkom. Via de search had ik al het een en ander gevonden, maar toch krijg ik het niet werkend.
Het probleem
In mijn statistieken systeem archief/verwerk ik rauwe gegevens naar iets wat het een en ander kan zeggen. Eerst deed ik dit gehele verwerken in PHP, maar op dit moment heb ik al heel veel geport naar C++, wat qua snelheid al het een en ander verbeterd heeft.
Mijn streven is vooral om zo veel mogelijk alles direct in queries te doen, zonder dat er dus nog een applicatie laag tussen zit die dingen afhandeld. Nu heb ik echter een query nodig waar ik dus niet uitkom, wat er moet gebeuren is aardig eenvoudig. Even versimpelt weergegeven:
* Er is een tabel 'stats' met veel gegevens, waaronder de entrypageid. Dit is de id van de pagina waar de bezoeker op binnenkwam.
* Er is date field in deze tabel, wat aangeeft wanneer de bezoeker langskwam.
* Er is een tabel 'archive' waarin alle dates (per dag dus een!) sinds de start van de telling tot nu als date field opgeslagen zijn.
Nu wil ik per dag bijvoorbeeld de top 30 van de entrypageid's hebben. Dus per dag een lijst van 30 id's van hoog naar laag, op pagina 1 kwamen bijv 10 bezoekers, op pagina 2 maar 8, op pagina 3 slechts 7.. etc.
Echter krijg ik dit dus niet voor elkaar, en zit hier al enkele uren mee te klooien. Per dag een query is niet de bedoeling: Dit zou nu al 1000 queries zijn. Nu worden de statistieken natuurlijk niet elke keer vanaf het start punt verwerkt... maar toch zou ik dit graag goed hebben. Het zou dan toch ook gewoon mogelijk moeten zijn?
Per dag zou het zo zijn:
code:
1
2
3
4
| INSERT INTO archive_entries (moment, pageid, visitors) SELECT s.date, s.entrypageid , COUNT( s.entrypageid FROM statistics s WHERE s.date= "2007-01-20" GROUP BY entrypageid ORDER BY num DESC LIMIT 30; # (0.156sec) |
Ik heb al zitten experimenteren met temporary tables, sub queries en full outer joins, maar ik loop steeds tegen iets aan waardoor het gewoon niet goed gaat, of alleen de eerste dag, etc. Ik heb helaas al die queries niet meer omdat ik een query had geschreven die dependable was, en nogal hard gestopt moest worden
Dus misschien dat iemand hier die een goede suggestie heeft?