[sql] Gerelateerde artikelen op basis van koopgedrag

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 08-09 16:22
Ik ben momenteel met een webshop bezig en wil nu graag gerelateerde producten laten zien aan bezoekers, met als simpel doel dat ze meer producten bekijken en dus meer kopen. Het ontbreekt echter aan van tags, goede omschrijvingen of een logische indeling. Het is dus niet mogelijk om op basis van dat soort zaken de gebruiker iets voor te schotelen. Ik zit dus te denken aan aan het principe dat Bol.com o.a. ook hanteert: op basis van eerder koopgedrag van anderen.

Ik heb (versimpeld weergegeven) een koppeltabel KlantBestelling (klantId, productId, aantal) waar ik iets mee wil. Eerst op basis van het huidige artikel kijken wíe dat artikel allemaal besteld heeft (SELECT klantId FROM KlantBestelling WHERE productId = 123). Met die lijst (laten we zeggen dat klantnr's 1, 2 en 4 dat artikel ook hebben hebben besteld) kan ik weer kijken welke producten onder die klanten populair zijn: SELECT productId, SUM(aantal) FROM KlantBestelling WHERE klantID IN (1, 2, 4) GROUP BY productId.

Ik wil ze echter ophalen met slechts één query (en ik vermoed dat dat geen utopie is).

Ik heb het ook al met een subquery geprobeerd, maar die subquery krijgt meerdere rijen terug, en werkt dus ook niet: SELECT productId, SUM(aantal) FROM `KlantBestelling ` WHERE klantId = (SELECT klantId FROM KlantBestelling WHERE productId= 123)

Wie helpt me uit de brand?

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Je vergeet de GROUP BY in je tweede query. En je = moet een IN zijn, vlak voor je subquery.

[ Voor 36% gewijzigd door GlowMouse op 10-08-2011 22:36 ]


Acties:
  • 0 Henk 'm!

  • StephanVierkant
  • Registratie: Mei 2003
  • Laatst online: 08-09 16:22
Volgens mij heb ik 'm al:

SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SELECT
    producten.*
FROM
    producten 
INNER JOIN
    KlantBestelling ON producten.id = KlantBestelling.productId
WHERE
    klantId IN (SELECT klantId FROM KlantBestellingWHERE product = '123')
    AND
    KlantBestelling.productId !=  '123'
GROUP BY
    KlantBestelling.productId
ORDER BY
    SUM(KlantBestelling.aantal) DESC
LIMIT 
    3