Ik ben bezig met een database voor een webshop. Om de omzet in een bepaalde periode te berekenen, al dan niet voor bepaalde producttypen / betaalmethoden gebruik ik de volgende SQL query:
Dit werkt prima, ik krijg een mooi overzicht van alle bestelde producten. Met PHP tel ik de bedragen / verzendkosten op, dat gaat goed.
Nu had ik echter één ding over het hoofd gezien. Bestellingen hebben een status. Er zijn verschillende statussen, maar er zijn er 2 belangrijk:
- Bestelling geplaatst
- Geannuleerd
In deze gevallen mag de bestelling (bestaande uit 1 of meerdere producten) niet worden meegenomen voor de omzet berekening, omdat er (nog) geen betaling is ontvangen.
De statussen zijn opgeslagen in tabel order_statussen, en krijgen een datum (timestamp), id (=ordernummer) en status mee.
Nu kan ik de statustabel joinen met:
Maar het probleem is dat er per bestelling vaak meerdere statussen zijn. Eerst bestelling geplaatst, dan betaling ontvangen, dan verzonden. Alleen de laatste status (hoogste timestamp waarde) mag worden gekoppeld aan de tabel. Ik wil dus eigenlijk een WHERE voorwaarde binnen de LEFT JOIN opgeven, maar dat kan volgens mij niet.
Misschien kan ik een WHERE voorwaarde op de gehele query toevoegen, die dan alleen de nieuwste status (op basis van order_statussen.datum) binnen een bepaalde order laat zien. Maar ik weet niet hoe ik dat moet doen. Wie kan me helpen?
code:
1
2
3
4
5
6
7
8
9
10
| SELECT bestellingen.*, order_producten.*, producten.type FROM order_producten JOIN bestellingen ON order_producten.order_id=bestellingen.id JOIN producten ON order_producten.bestelnr=producten.id WHERE bestellingen.datum < FROM_UNIXTIME(%s) AND bestellingen.datum > FROM_UNIXTIME(%s) AND betaalmethode LIKE '%s' AND type LIKE '%s' |
Dit werkt prima, ik krijg een mooi overzicht van alle bestelde producten. Met PHP tel ik de bedragen / verzendkosten op, dat gaat goed.
Nu had ik echter één ding over het hoofd gezien. Bestellingen hebben een status. Er zijn verschillende statussen, maar er zijn er 2 belangrijk:
- Bestelling geplaatst
- Geannuleerd
In deze gevallen mag de bestelling (bestaande uit 1 of meerdere producten) niet worden meegenomen voor de omzet berekening, omdat er (nog) geen betaling is ontvangen.
De statussen zijn opgeslagen in tabel order_statussen, en krijgen een datum (timestamp), id (=ordernummer) en status mee.
Nu kan ik de statustabel joinen met:
code:
1
| LEFT JOIN order_statussen ON order_producten.order_id=order_statussen.id |
Maar het probleem is dat er per bestelling vaak meerdere statussen zijn. Eerst bestelling geplaatst, dan betaling ontvangen, dan verzonden. Alleen de laatste status (hoogste timestamp waarde) mag worden gekoppeld aan de tabel. Ik wil dus eigenlijk een WHERE voorwaarde binnen de LEFT JOIN opgeven, maar dat kan volgens mij niet.
Misschien kan ik een WHERE voorwaarde op de gehele query toevoegen, die dan alleen de nieuwste status (op basis van order_statussen.datum) binnen een bepaalde order laat zien. Maar ik weet niet hoe ik dat moet doen. Wie kan me helpen?
Nederlander in België