[SQL/PHP] Dubbele tonen

Pagina: 1
Acties:
  • 172 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
ik heb 1 tabel

In de tabel staat bijv.

id - userid - productid
  1. - 1 - 2
  2. - 1 - 3
  3. - 2 - 2
  4. - 2 - 4
  5. - 3 - 1
  6. - 3 - 4
Zoals je hier ziet hebben zowel User1 als User2 het Product2. User2 en User3 hebben het Product4. Nu wil ik dus eigenlijk in een query laten zien welke producten er nu door meerdere mensen gekocht zijn. En dan voornamelijk door wie.

Ik zat eerst te denken om het op deze manier te doen:
code:
1
2
3
4
SELECT count( productid ) , productid
FROM buy
GROUP BY productid 
LIMIT 0 , 30

Hiermee zie je hoeveel mensen een product gekocht hebben maar dan loop ik vast want hoe kan ik zien welke personen bijv. de zelfde producten gekocht hebben als User1.

Wil ik nu iets wat gewoon niet mogelijk is of kijk ik er nu verkeerd tegen aan. Ik kan namelijk wel met de search vinden hoe ik dubbelen eruit filter maar niet hoe ik juist de dubbele kan zien.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:30
Je roept in een enkel topic een heleboel verschillende dingen:
• Door hoeveel mensen is elk product gekocht? (Daar had je al een query voor.)
• Welke producten zijn door meerdere mensen gekocht?
• Welke personen hebben hetzelfde gekocht als een specifieke andere persoon?
Merk op dat die laatste vraag nog niet duidelijk genoeg is: wat is het 'hetzelfde gekocht hebben'? Is dat minstens 1 product gemeen hebben? Of is dat exact dezelfde set producten gekocht hebben? Of is dat dezelfde producten gekocht hebben als de specifieke persoon en eventueel nog meer? Je moet kiezen welke interpretatie je aan je vraag wil koppelen.

Dat zijn verschillende vragen en daar horen verschillende SQL queries bij. Voor we je er mee kunnen helpen moet je dus duidelijk voor ogen hebben wat nu de bedoeling is. Dat kan jij echt alleen zelf beslissen.

Acties:
  • 0 Henk 'm!

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 00:16
Soultaker schreef op woensdag 23 maart 2005 @ 17:45:
• Welke producten zijn door meerdere mensen gekocht?
SQL:
1
2
3
4
5
SELECT count( productid ) , productid
FROM buy
GROUP BY productid 
HAVING COUNT(productid)>1
LIMIT 0 , 30


Voor de laatste query is het inderdaad belangrijk wat jij wilt, zoals Soultaker al heeft vermeld.

[ Voor 15% gewijzigd door jvdmeer op 24-03-2005 07:50 ]


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik zal kijken of ik de bedoeling vanuit het klant oogpunt kan uitleggen

Stel ik ben klant nummer 1 ik koop product 1, product 2 en product 3

Klant 2 koopt product 1, product 2 en product 4.
Klant 3 koopt product 2 en product 4


Ik als klant 1 wil dus eigenlijk zien wie nog meer het zelfde product als mij gekocht heeft.

Klant 2 heeft 2 dezelfde producten als mij gekocht en klant 3 heeft maar 1 product hetzelfde als ik gekocht.

Mijn vraag is dus eigenlijk hoe ik dat ga laten zien. Of kan dat niet met de manier dat ik de tabel gemaakt heb.

[ik hoop dat het zo iets duidelijker is]

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:30
Je hebt dus in jouw voorbeeld zo'n tabel:

Tabel "koopt"
KlantProduct
11
12
13
21
22
24
32
34

Je kijkt vanuit een bepaalde klant (zeg, klant 1) en kijkt eerst welke producten die allemaal gekocht heeft (bijvoorbeeld, 1, 2 en 3). In je tabel kun je dat vinden met een query als:
SQL:
1
SELECT Product FROM Koopt WHERE Klant = 1

Vervolgens kijk je welke klanten allemaal die producten hebben gekocht; dat doe je door alle rijen te selecteren waarbij een klant een product uit het eerdere lijstje kocht:
SQL:
1
2
3
SELECT Klant, Product
FROM Koopt
WHERE Product IN (1, 2, 3)

Dat levert als resultaat op:
KlantProduct
11
12
13
21
22
32
De rijen met product 4 zijn verdwenen, want die zijn niet relevant (die kocht klant 1 niet). Vervolgens hoef je alleen maar te tellen hoe vaak elke klant in de resultaten voorkomt; dat is namelijk het aantal producten dat 'ie gemeen heeft met klant 1. Dat kan ook in SQL uitgedrukt worden, door te groeperen per klant:
SQL:
1
2
3
4
SELECT Klant, COUNT(Product) AS AantalProducten
FROM Koopt
WHERE Product IN (1, 2, 3)
GROUP BY Klant

Je hebt niet vermeld wat voor databasesysteem gebruikt, dus de uitwerking kan wat verschillen, maar ee beetje geavanceerd RDBMS kan die twee queries combineren, tot zoiets:
SQL:
1
2
3
4
5
6
7
SELECT Klant, COUNT(Product) AS AantalProducten
FROM Koopt
WHERE Product IN
  ( SELECT Product
    FROM Koopt
    WHERE Klant = 1 )
GROUP BY Klant

Als je MySQL gebruikt (niet onwaarschijnlijk in combinatie met PHP en het feit dat je praktisch niets van SQL weet) dan moet je twee queries helaas apart uitvoeren.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja het is MySql. Ik zou zo is kijken of ik die 2 queries kan maken.

Acties:
  • 0 Henk 'm!

  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:30
Het kan trouwens ook met MySQL wel in een enkel query:
code:
1
2
3
4
5
6
SELECT K1.Klant AS Klant,
       COUNT(K1.Product) AS AantalProducten
FROM Koopt AS K1, Koopt AS K2
WHERE K1.Product = K2.Product
  AND K2.Klant = 1
GROUP BY K1.Klant

Maar denk er even goed over na, voordat je dit letterlijk overneemt. Het is nuttig om te begrijpen hoe het werkt zodat je later zelf soortgelijke oplossingen kan maken.

Overigens krijg je nu een rij terug voor elke klant die tenminste 1 product hetzelfde heeft als klant 1 (inclusief klant 1 zelf), maar het is ook mogelijk een query te maken die een rij oplevert voor élke klant (waarbij klanten die geen producten gemeen hebben met klant 1 dus een '0' in de AantalProducten-kolom krijgen). Daarvoor moet je een speciale JOIN gebruiken; zie daarvoor de MySQL manual over joins.

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Soultaker schreef op donderdag 24 maart 2005 @ 16:21:

code:
1
2
3
4
5
6
SELECT K1.Klant AS Klant,
       COUNT(K1.Product) AS AantalProducten
FROM Koopt AS K1, Koopt AS K2
WHERE K1.Product = K2.Product
  AND K2.Klant = 1
GROUP BY K1.Klant
Als ik het goed begrijp kan je dus doormiddel van K1 en K2 nu dus eigenlijk 2x de zelfde tabel in 1 querie gebruiken. En daarmee gebeurt nu exact wat ik wou.
Pagina: 1