Beste mensen,

Ik ben bezig aan een webwinkel. Heb al eens eerder een gemaakt, maar deze is lastiger.

De query moet een tabel opleveren die alle binnengekomen orders op een rijtje zet.

Ik heb 4 tabellen waar de informatie vandaan moet komen:

KLANTEN
id | voornaam | achternaam | etc...

ORDERS
id | klanten_id | datum

ORDERREGELS
orders_id | producten_id | aantal

PRODUCTEN
id | naam | prijs

Wat ik wil maken is een overzicht (een tabel) van de binnengekomen orders.

Ik heb al een vrij lange query; die gaat als volgt:



$sql = "SELECT orders.id, orders.datum, orders.status, klanten.voornaam, klanten.achternaam, count(producten.id) as aantal, sum(producten.prijs) as waarde, orderregels.orders_id, orderregels.producten_id, sum(orderregels.aantal) as totaalaantal
			FROM orders, klanten, orderregels, producten
			WHERE orderregels.orders_id = orders.id
				AND producten.id = orderregels.producten_id
				AND klanten.id = orders.klanten_id";



Het is een query die goed werkt. Het levert veel waardevolle informatie. Wat ik echter nog graag zou willen zien is de totale waarde van zo'n order. Als er zeg maar 2 producten van 50 euro zijn besteld, en 3 producten van 100 euro, dat er dan staat: Totale waarde: 400 euro.

Hoe zou ik dat het best kunnen doen?

Alvast heel erg bedankt,

Robbert
Ik snap 't.

Wat is de beste manier om klanten.naam erbij op te halen? Een order heeft altijd een klant.

Ik heb nu:


SELECT orders.id, date_format(orders.datum, '%d-%m-%Y - %H:%i') AS geplaatst,
orders.status, CONCAT(klanten.achternaam, ', ', klanten.voornaam) as naam,
 SUM(orderregels.aantal * orderregels.prijs) AS order_totaal, 
SUM(orderregels.aantal) AS aantal_totaal


Waarin ik aggregatie toepas op velden uit ORDERREGELS. Alleen naam haal ik 'kaal' op, daar groepeer ik dan ook mede op.

Ik ben benieuwd hoe MySQL die tabel dan ophaalt.

Stel een order bestaat 3 orderregels, en ik zou niet groeperen.

Dan krijg ik bijvoorbeeld 3 rijen:

order_id klant_naam product id aantal
1 robbert 2 10
1 robbert 5 8
1 robbert 6 3

Dan zou ik denk ik iets als dit krijgen.

Hoe moet ik omgaan met klant_naam, het is namelijk een veld die niet uit ORDERS komt, maar uit KLANTEN. Moet ik deze aggregeren? Want er zal elke keer hetzelfde uitkomen.
Als je de orderregels apart wilt ophalen, zul je dus niet moeten gaan groeperen. In dat geval moet je er vrede mee nemen dat je in elk record ook de klantnaam ophaalt, of je moet verschillende queries willen gebruiken.

Groeperen doe je alleen als je eigenschappen van een groep wilt bepalen. Dus bijvoorbeeld aantal records in een groep, totalen van een bepaalde groep, etc.
Nee, ik wil de orderregels niet apart ophalen, maar dat doet de query op de achtergrond natuurlijk wel (want hoe moet ie anders komen aan COUNT(orderregels.id) en SUM(orgerregels.prijs)).

Daarom was mijn vraag hoe de query omgaat met klanten.naam, omdat ik daar verder geen aggregatie op toepas.
De vuistregel is duidelijk: groeperen op alle kolommen waarop je geen aggregatie functie toepast.

In sommige queries (en je huidige query ook) zal het geen invloed hebben op de uitkomst aangezien je ook groepeert op een gegeven dat andere groepen verder onder verdeelt (orders.id verdeelt klanten.naam verder). De groepen die gemaakt worden door het groeperen op order.id worden dus aangehouden. Maar voor een correcte query is het van belang dat je wel blijft groeperen op alle kolommen, dus ook op klanten.naam.

Reageren