M'n probleem valt moeilijk te omschrijven in één korte topic titel 
Maar het volgende is het geval: Ik heb een tabel waarin ik alle views van een bepaald onderdeel van m'n site opsla met de volgende velden:
id (auto_increment)
session_id (id van sessie van bezoeker)
section (bevat 'A' of 'B')
referer (bevat 'homepage' of 'direct')
item_id (bekeken item op pagina, verder niet belangrijk)
Een bezoeker kan op de A of B section komen via m'n homepage, of direct via invoer van de URL. De referer blijft net als de session_id identiek voor elke view van deze bezoeker, ook als ze switchen tussen A en B
Nu kan uiteraard een bezoeker meerdere views genereren in zowel de A als B section. Wat ik nu uit mijn database wil trekken is het aantal unieke bezoekers (unieke session_ids) die op elke van de combinatie van section en referer binnenkomt, dus de allereerste view van de desbetreffende bezoeker. Wat ik dus terug moet krijgen zijn 4 rijen, bijv
Nou heb ik al een dag of wat erop lopen puzzelen, met in m'n hoofd het idee dat het toch echt niet zo moeilijk moest zijn.. maar lukken wilde het niet...
Met de simpele query
krijg ik wel exact de rijen terug die ik opgeteld wil zien; ik krijg netjes de eerste view van elke unieke session_id terug
Daarna probeerde ik de volgende query
met als resultaat dat ik inderdaad 4 rijen terugkrijg met het aantal bezoekers per section-referer combinatie, alleen worden bezoekers die zowel section A als B hebben bekeken dubbel geteld. dit omdat DISTINCT niet voor 1 veld geldt, maar voor de hele rij, en ziet dus session_id + sectionA en session_id + sectionB als unieke (distinct) rijen.
Dat verhaal gaat dus ook niet door.
Uiteindelijk met veel gepuzzel kwam er het volgende gedrocht uit de mouw:
Dit geeft uiteindelijk WEL het gewenste resultaat, alleen mijn grote maar in deze query is dat het mij veel te omslachtig en te zwaar dan nodig is. Ook kan ik natuurlijk verder in PHP de rijen gaan tellen mbv een eerdere geplaatste query. Alleen moet voor mijn idee dezelfde uitkomst ook gewoon met een mysql query teruggegeven moeten kunnen worden.. Is hetgene wat ik wil (voor zoverre dat duidelijk is
) niet met een (één!) veel simpelere query op te lossen?? Of moet ik alsnog terugvallen naar wat extra PHP of bovenstaande lap?
Maar het volgende is het geval: Ik heb een tabel waarin ik alle views van een bepaald onderdeel van m'n site opsla met de volgende velden:
id (auto_increment)
session_id (id van sessie van bezoeker)
section (bevat 'A' of 'B')
referer (bevat 'homepage' of 'direct')
item_id (bekeken item op pagina, verder niet belangrijk)
Een bezoeker kan op de A of B section komen via m'n homepage, of direct via invoer van de URL. De referer blijft net als de session_id identiek voor elke view van deze bezoeker, ook als ze switchen tussen A en B
Nu kan uiteraard een bezoeker meerdere views genereren in zowel de A als B section. Wat ik nu uit mijn database wil trekken is het aantal unieke bezoekers (unieke session_ids) die op elke van de combinatie van section en referer binnenkomt, dus de allereerste view van de desbetreffende bezoeker. Wat ik dus terug moet krijgen zijn 4 rijen, bijv
| aantal_bezoekers | section | referer |
|---|---|---|
| 12 | A | homepage |
| 26 | A | direct |
| 9 | B | homepage |
| 34 | B | direct |
Nou heb ik al een dag of wat erop lopen puzzelen, met in m'n hoofd het idee dat het toch echt niet zo moeilijk moest zijn.. maar lukken wilde het niet...
Met de simpele query
code:
1
| SELECT session_id, section, referer FROM views GROUP BY session_id |
krijg ik wel exact de rijen terug die ik opgeteld wil zien; ik krijg netjes de eerste view van elke unieke session_id terug
Daarna probeerde ik de volgende query
code:
1
| SELECT COUNT(DISTINCT(session_id)), section, referer FROM views GROUP BY section,referer |
met als resultaat dat ik inderdaad 4 rijen terugkrijg met het aantal bezoekers per section-referer combinatie, alleen worden bezoekers die zowel section A als B hebben bekeken dubbel geteld. dit omdat DISTINCT niet voor 1 veld geldt, maar voor de hele rij, en ziet dus session_id + sectionA en session_id + sectionB als unieke (distinct) rijen.
Dat verhaal gaat dus ook niet door.
Uiteindelijk met veel gepuzzel kwam er het volgende gedrocht uit de mouw:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
| SET @direct_a:=0;
SET @homepage_a:=0;
SET @direct_b:=0;
SET @homepage_b:=0;
SET @dummy:=0;
SET @sessionid='';
SELECT @direct_a, @homepage_a, @direct_b, @homepage_b, @dummy, @sessionid, IF(section = 'A' AND referer = 'direct' AND @sessionid <> session_id, @direct_a:=@direct_a+1,
IF(section = 'A' AND referer = 'homepage' AND @sessionid <> session_id, @homepage_a:=@homepage_a+1,
IF(section = 'B' AND referer = 'direct' AND @sessionid <> session_id, @direct_b:=@direct_b+1,
IF(section = 'B' AND referer = 'homepage' AND @sessionid <> session_id, @homepage_b:=@homepage_b+1, @dummy=0)
)
)
) AS calc, @sessionid:=session_id
FROM views
ORDER BY session_id,id
SELECT @direct_a,@homepage_a,@direct_b,@homepage_b; |
Dit geeft uiteindelijk WEL het gewenste resultaat, alleen mijn grote maar in deze query is dat het mij veel te omslachtig en te zwaar dan nodig is. Ook kan ik natuurlijk verder in PHP de rijen gaan tellen mbv een eerdere geplaatste query. Alleen moet voor mijn idee dezelfde uitkomst ook gewoon met een mysql query teruggegeven moeten kunnen worden.. Is hetgene wat ik wil (voor zoverre dat duidelijk is
Think of me long enough to make a memory