Autor Zpráva
midlan
Profil
Ahoj,

potřeboval bych radu jak procházet produkty podle určité priority. V mém případě podle prodejnosti. Dejme tomu, že mám eshop, ale nemám sklad a objednávky rovnou předávám dodavateli. Při procházení (SELECT) produktů (a jejich následné kontrole dostupnosti u dodavatele) bych chtěl upřednostnit ty produkty které se nejvíce prodávají (abych minimalizoval dobu, kdy budu prodávat produkty, které už dodavatel nemá). Zkontrolovat všechny najednou nelze, kvůli jejich velkému počtu.

Věděl by někdo jak takovou prioritu zavést na úrovni dotazu? Díky.
Keeehi
Profil
Pořadí se určuje pomocí ORDER BY jmeno-sloupce. Pak už jen záleží, zda jsou v té databázi údaje, z kterých jde prodejnost zjistit.
tiso
Profil
midlan: „abych minimalizoval dobu, kdy budu prodávat produkty, které už dodavatel nemá
Toto nevyriešiš tým selectom, ale tak, že budeš označovať dostupnosť produktov (stĺpec v tabuľke produktov). A potom zobrazíš iba dostupné.
midlan
Profil
Keeehi:
Ano jak funguje klauzule ORDER BY vím. Jenže v tomto případě ji nelze použít tak jednoduše. Nejlépe prodávané produkty by se měly kontrolovat několikrát denně, a ty nejméně prodávané třeba jednou za týden. Dejme tomu, že vzorec na počet kontrol za den je přibližně min(n/30, 0.15), kde n je prodejnost za posledních 30 dnů. Prodejnost je známá.

Vhledem k velkému počtu produktů, bude tento dotaz pokládat PHP script každou minutu. A následně hned provádět kontrolu (a případně měnit skladovou dostupnost produktů).

tiso:
Aby se nezobrazovaly vyprodané produkty je vyřešené. Je to funkční eshop se vším všudy. Select má v tomto případě vrátit seznam produktů ke kontrole.
Kajman
Profil
midlan:
Máte u produktů sloupec, kde je datum poslední kontroly dostupnosti?

Každý produkt musíte kontrolovat samostatně? Nelze u dodavatele zjistit seznam všech dostupných produktů jedním požadavkem?
midlan
Profil
Kajman:
Sloupec nemám, zavést ho mohu.

Jejich API nabízí jen možnost jedním požadavkem kontrolovat jen jeden produkt.
Kajman
Profil
Zavedl bych tedy sloupec s tou poslední kontrolou. Pak bych si seřadil produkty sestupně podle počtu prodaných kusů od té poslední kontroly. Druhý parametr řazení pak bude ten nový sloupec s datumem.

Z toho seznamu můžete vzít omezený počet řádků. Případně ho doplnit o řádky, kde datum poslední kontroly je příliš staré.
midlan
Profil
Kajman:
To zní rozumně, udělám to tak. Díky!
midlan
Profil
Algoritmus funguje dobře, jen po několika měsících provozu jsem přišel na slabé místo toho algoritmu. Konkrétně: když v případě dobře prodávaného produktu se zjistí že je u dodavatele vyprodaný, automaticky se nastaví že není skladem. To je správně. Ale má to háček. Produkt je nyní vyprodaný, nejsou prodávány žádné kusy (logické když je vyprodaný), jeho priorita zůstane už navždy 0 (když prioritou je počet prodaných kusů od poslední kontroly). Pokud skript na kontrolu skladu neběží dostatečně často, na produkty s prioritou 0 už nikdy nemusí dojít, zůstanou ve stavu není skladem už navždy (přestože dodavatel už produkt může mít opět skladem). Případně zůstane vyprodaný hodně dlouhou dobu, což působí prodejní ztráty, zvlášť v případě (v minulosti) dobře prodávaného produktu.
Kajman
Profil
Můžete mít ještě druhou frontu, kde budete kontrolovat jen vyprodané produkty, zda již nejsou opět k mání. Řadit např. vzestupně podle počtu kontrol, kdy stále není skladem (při navrácení čítač vynulovat).

Fronty můžete nějak střídat - např. jednu hodinu denně věnovat těmto případům.

Edit:
midlan:
na produkty s prioritou 0 už nikdy nemusí dojít, zůstanou ve stavu není skladem už navždy

Na takové produkty by mělo dojít díky „doplnit o řádky, kde datum poslední kontroly je příliš staré“, ale je pravda, že to může být zbytečně za dlouho.
midlan
Profil
Kajman:
Na takové produkty by mělo dojít díky ‚doplnit o řádky, kde datum poslední kontroly je příliš staré‘, ale je pravda, že to může být zbytečně za dlouho.

Tuto funkcionalitu jsem právě tehdy nezaimplementoval. Spoléhal jsem na to, že kontrola poběží dostatečně často, a že se dostane i na produkty s prioritou 0. Což se však po čase ukázalo že se neděje, kontrola tedy neběží dostatečně často. Děkuji za radu, nějaké z nabízeních řešení tedy použiji.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0