In een online winkel heb ik producten die vanuit meerdere leveranciers kunnen komen. Iedere leverancier heeft eigen levertijden en limieten tot wanneer de levertijd nog gehaald kan worden (bijv voor 22 uur besteld, morgen in huis). 22:01 bestellen is dus meteen overmorgen in huis.
Nu wil de klant dat ik een productlijst toon met als productprijzen de laagste prijs van de groep leveranciers die dat product het vroegst kunnen leveren. De leveranciers zijn allen "vandaag", "morgen" of "overmorgen" wat levering betreft, maar ze hebben allemaal andere limitieten (voor 13 uur, voor 17 uur en voor 22 uur). Dus belangrijkste is levertijd, daarna prijs.
Ik heb een database met 3 tabellen hiervoor (alleen relevante velden geschreven);
Mijn opties lijken me:
Optie 2 zitten wat haken en ogen aan, bijv; hoe vaak voer ik die cron uit bijvoorbeeld (als cron nodig). Bovendien vind ik het nog steeds lastig te visualiseren welke stappen noodzakelijk zijn en of ik het niet te ingwikkeld wil maken.
Hoe kan ik dit het beste aanpakken?
Nu wil de klant dat ik een productlijst toon met als productprijzen de laagste prijs van de groep leveranciers die dat product het vroegst kunnen leveren. De leveranciers zijn allen "vandaag", "morgen" of "overmorgen" wat levering betreft, maar ze hebben allemaal andere limitieten (voor 13 uur, voor 17 uur en voor 22 uur). Dus belangrijkste is levertijd, daarna prijs.
Ik heb een database met 3 tabellen hiervoor (alleen relevante velden geschreven);
- product[ean] (+/-10.000 records)
- productstock[ean, supId, stock, price] (+/-25.000 records)
- supplier[id, orderBefore, deliveryTime] (5 op dit moment)
code:
(40667 is eigenlijk huidige tijd vanaf middernacht in seconden) Wat ik hier lastig vind is om dit terug te brengen tot 1 resultaat per ean. GROUP BY levert me een willekeurig resultaat, terwijl iedere keer de bovenste optie per ean de gewenste waardes bevat (afgezien dat ik een SUM(stock) ook nodig heb)1
2
3
4
5
| SELECT sp.id, sp.ean, sp.stock, sp.price, sup.id, IF(sup.orderBefore>40667, sup.deliveryTime, sup.deliveryTime+86400) as actualDLT FROM `productstock` sp JOIN `supplier` as sup ON sp.pid = sup.id WHERE sp.stock > 0 ORDER BY ean, actualDLT, price |
Mijn opties lijken me:
- Een query vinden die bovenstaande omschrijving kan, binnen 0,1 seconden. (Anders is de klant niet tevreden) Maar ik heb er nog niet eens een gevonden die het uberhaupt kan. (zou dit moeten kunnen??)
- Regelmatig (via cron) de product tabel updaten, daar een veld price (en stock) in zetten. Dan mag de query iets langer duren en is de productlijst tonen veel sneller.
Optie 2 zitten wat haken en ogen aan, bijv; hoe vaak voer ik die cron uit bijvoorbeeld (als cron nodig). Bovendien vind ik het nog steeds lastig te visualiseren welke stappen noodzakelijk zijn en of ik het niet te ingwikkeld wil maken.
Hoe kan ik dit het beste aanpakken?