Hulp gevraagd bij uitbreiding query
In bijgaande query toon ik de aankopen van een klant. Nu krijg ik per regel ook het genre van de aankoop mee. Hoe kan ik deze query nu verder optimaliseren om het aantal per gekocht genre te laten zien. Juist dit aantal heb ik nodig om de klant beter te kunnen "bedienen" als hij/zij de shop binnenkomt.
Even een korte uitleg:
shop__klanten bevat de naw-gegevens van de klant
kt_genre is een koppeltabel die de tabellen shop__genre en shop__bestellingen aan elkaar linkt
shop__bestellingen is de tabel waar alle gekochte producten, per klant, staan opgeslagen
shop__genre is de tabel waarin de genres van de producten staan opgeslagen
Code (php)
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
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
<?php
select
k.voorletters,
k.tussenvoeg,
k.achternaam,
k.klantnummer,
b.artikelnummer,
g.genre
from
shop__klanten as k
join
shop__bestellingen as b
on
b.klantnummer = k.klantnummer
join
kt__genre as kt
on
b.artikelnummer = kt.a_id
join
shop__genre as g
on
g.g_id = kt.g_id
where
k.wismarkering = 0 and b.klantnummer = '10408' // Deze laatste waarde wordt aangepast naar gelang de selectie van de klant
order by
k.klantnummer
?>
select
k.voorletters,
k.tussenvoeg,
k.achternaam,
k.klantnummer,
b.artikelnummer,
g.genre
from
shop__klanten as k
join
shop__bestellingen as b
on
b.klantnummer = k.klantnummer
join
kt__genre as kt
on
b.artikelnummer = kt.a_id
join
shop__genre as g
on
g.g_id = kt.g_id
where
k.wismarkering = 0 and b.klantnummer = '10408' // Deze laatste waarde wordt aangepast naar gelang de selectie van de klant
order by
k.klantnummer
?>
Wie heeft voor mij een suggestie?
George
Wil je het aantal gekochte artikelen per genre tellen met COUNT(*), bedoel je dat? Dan zou ik dat beslist eens heroverwegen, want er zijn slimmere algoritmen te verzinnen voor een webwinkel.
Dat van ORDER klopt. Ik heb in eerste instantie de query gemaakt om een totaalbeeld te krijgen.
Het tellen van het aantal artikelen per genre wilde ik inderdaad met een COUNT doen. Heb jij een beter alternatief?
Kun je ongeveer het soort artikelen noemen?
Code (php)
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
select
k.voorletters,
k.tussenvoeg,
k.achternaam,
k.klantnummer,
b.artikelnummer,
g.genre,
COUNT(IF(g.genre = 'Koor', 'Ja', NULL)) AS koor,
COUNT(IF(g.genre = 'Klassiek', 'Ja',NULL)) AS klassiek
from
shop__klanten as k
join
shop__bestellingen as b
on
b.klantnummer = k.klantnummer
join
kt__genre as kt
on
b.artikelnummer = kt.a_id
join
shop__genre as g
on
g.g_id = kt.g_id
where
k.wismarkering = 0 and b.klantnummer = '10408'
k.voorletters,
k.tussenvoeg,
k.achternaam,
k.klantnummer,
b.artikelnummer,
g.genre,
COUNT(IF(g.genre = 'Koor', 'Ja', NULL)) AS koor,
COUNT(IF(g.genre = 'Klassiek', 'Ja',NULL)) AS klassiek
from
shop__klanten as k
join
shop__bestellingen as b
on
b.klantnummer = k.klantnummer
join
kt__genre as kt
on
b.artikelnummer = kt.a_id
join
shop__genre as g
on
g.g_id = kt.g_id
where
k.wismarkering = 0 and b.klantnummer = '10408'
Het gaat hier om de site www.jqz.nl die voornamelijk klassiek en religieus verkoopt.
De genres zijn dan ook:
Orgel, koor, gospel, instrumentaal, passie, kerst, klassiek en prmium
Begin bijvoorbeeld eens met de herkenbare: "Anderen die x kochten, kochten ook y en z." Kijk dus niet naar het genre, maar naar de bestelde artikelen afzonderlijk en vergelijk die met de bestellingen van kopers die hetzelfde artikel bestelden.
Zo creëer je als het ware verschillende gebruikersprofielen van mensen met een vergelijkbare smaak.
Wat anderen kochten staat al op de startpagina
Wat ik precies wil is het volgende:
De startpagina toont een drietal cd's uit de catalogus. Dit gebeurt ad-random. Dus elke keer een andere aanbeveling. Nu wil ik die query laten leiden door de koopsmaak van de bezoeker op basis van het ip-adres.
Dus als een klant "veel" koorzang koopt, wil ik die klant dan ook koorzang onder de aandacht brengen.
Dan heb je een heel andere query nodig. Waarom begin je met SELECT k.voorletters, k.tussenvoeg, k.achternaam? Je hebt de voorletters van de klant toch niet nodig om weer te geven producten op basis van IP-adres te selecteren?
Toevoeging op 05/10/2013 16:26:40:
Na wat puzzelen heb ik een, voor mij, goede oplossing:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
select
g.genre as genre,
count(b.id) as aantal
from
shop__klanten as k
join
shop__bestellingen as b
on
b.klantnummer = k.klantnummer
join
kt__genre as kt
on
b.artikelnummer = kt.a_id
join
shop__genre as g
on
g.g_id = kt.g_id
where
k.wismarkering = 0 and b.klantnummer = '10408'
group by
g.genre
order by
aantal desc
g.genre as genre,
count(b.id) as aantal
from
shop__klanten as k
join
shop__bestellingen as b
on
b.klantnummer = k.klantnummer
join
kt__genre as kt
on
b.artikelnummer = kt.a_id
join
shop__genre as g
on
g.g_id = kt.g_id
where
k.wismarkering = 0 and b.klantnummer = '10408'
group by
g.genre
order by
aantal desc
Deze query toont de aantallen per genre door een klant gekocht en het genre met de meeste aankopen bovenaan.
In ieder geval bedankt voor het meedenken
George
Topic gesloten