[MySQL]Group by uit een join

Pagina: 1
Acties:

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Sorry voor de vage topic titel maar ik kon weinig anders verzinnen.

Stel ik heb 3 tabellen:

PRODUCTEN:
ID
Naam

ARTIKELEN
ID
ProductID
Naam

RATING
ID
ArtikelID
Cijfer

Nu wil ik 1 query maken waarin ik tel hoeveel artikelen er in een product zit én de gemiddelde rating, bij de overzicht van producten:

code:
1
2
3
4
5
SELECT producten.naam, COUNT(artikelen.id), AVG(rating.cijfer)
FROM producten
LEFT JOIN artikelen ON artikelen.productid = producten.id
LEFT JOIN rating ON rating.artikelid = artikelen.id
GROUP BY artikelen.id, rating.artikelid, producten.naam


Maar ik krijg er eigenlijk niks uit. Ik denk dat het komt omdat ik meerdere rijen uit de join van rating krijg die niet allemaal bij de AVG worden opgeteld?

Ik wil namelijk graag kunnen sorteren op de gemiddelde rating.

Ik heb het ook geprobeerd met een subquery maar daar kom je op hetzelfde probleem uit.

Iemand die een zetje heeft?

[ Voor 9% gewijzigd door Megamind op 17-06-2007 17:13 ]


  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Maar ik krijg er eigenlijk niks uit.
Dat betekent een lege resultset? Aub iets duidelijker zijn. ;)
Ik zie zo gauw geen fout in je query. En sowieso is het handig om de query eens te doen zonder group by en aggregate functions zodat je kan zien welke data uberhaupt gegroepeerd moet worden. Een dergelijke query zal in dit geval blijkbaar ook 0 rijen moeten opleveren. ;)

Overigens is 'group by artikelen.id, rating.artikelid ...' dubbelop, die had je al gelijkgesteld bij de join. :P

{signature}


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Wat is 'ik krijg er niks uit' ?

In de group by clausule moet je alle velden opnemen die in je select-list staan, en geen aggregate zijn. In jouw geval dus enkel 'producten.naam'.
Dit wil dan wel zeggen dat je een probleempje hebt als je 2 producten hebt met dezelfde naam ....
Zie ook de PRG FAQ alwaar een stukje te vinden is over 'GROUP BY'.

https://fgheysels.github.io/


  • dusty
  • Registratie: Mei 2000
  • Laatst online: 25-11 22:57

dusty

Celebrate Life!

Ik zou persoonlijk ook voor een left outer join gaan aangezien het niet gegarandeerd zal zijn dat elke artikel een rating heeft.

Back In Black!
"Je moet haar alleen aan de ketting leggen" - MueR


  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Ja ik heb het stukje over GROUP BY al een paar keer doorgelezen, ik wil natuurlijk groeperen op de ArtikelID of Artikelen.ID.

Ik bedoel met niks, natuurlijk krijg ik gewoon rijen eruit, én het aantal artikelen per product, dat was natuurlijk wel te verwachten en daar breek ik mn hoofd ook niet over, maar die ratings wel.

Ik wil een een gemiddelde krijgen van de ratings van ALLE artikelen IN een product. Maar volgens mij gaat de join daarmee niet goed, aangezien ik altijd 0 eruit krijg

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
dusty schreef op zondag 17 juni 2007 @ 21:51:
Ik zou persoonlijk ook voor een left outer join gaan aangezien het niet gegarandeerd zal zijn dat elke artikel een rating heeft.
Er wordt ook geen inner join gebruikt? ;)
Megamind schreef op zondag 17 juni 2007 @ 21:53:
Ik wil een een gemiddelde krijgen van de ratings van ALLE artikelen IN een product. Maar volgens mij gaat de join daarmee niet goed, aangezien ik altijd 0 eruit krijg
Geef eens een voorbeeld. Laat van een artikel eens alle ratings zien. Laat merken dat je de 'debug-query' zonder group by en aggregate functions zoals door mij voorgesteld gedraaid hebt. Vertel of de meeste artikelen al een rating hebben, verklap eens welke datatype de rating kolom is, specificeer eens in de where clause een artikel welke zeker weten enkele ratings heeft, probeer en vertel eens wat meer.

{signature}

Pagina: 1