FAQ |
Kalender |
![]() |
#1 | ||
|
|||
Mycket flitig postare
|
Hej!
Försöker optimera mina SQL-frågor, för just nu ser det ut som ett rävbo, med sql och php om vartannat... Har lyckats en bra bit, men fastnat... Jag har en tabell med priser (per dag) under speciella perioder Kod:
room_id date_start date_end price Nu skall jag hämta priser från t.ex. 5/12 till 12/12 och koden jag har sen tidigare är (lite förenklat) Kod:
for ( $dag = 5; $dag <= 12; $dag++ ) { $sql = "SELECT price FROM tbl WHERE room_id = 2 AND date_start <= $dag AND date_end >= $dag"; $dagpris = mysql_result(mysql_query($sql)) $price += ($dagpris)?$dagpris:$standardpris; } Har gjort om mina fem andra queries till ett enda. |
||
![]() |
![]() |
![]() |
#2 | |||
|
||||
Bara ett inlägg till!
|
Hmm.
Förklara gärna lite bättre syftet bakom den aktuella frågan. "Hitta det första 'speciella priset' under perioden dag 5 till och med dag 12. Hittar du inte något pris så använd standardpriset." Varför är dag 5:s pris mer relevant än dag 12:s? En optimering kan vara följande Kod:
$l_dag_from = 5; $l_dag_to = 12; $sql = "SELECT price FROM tbl WHERE room_id = 2 AND date_start BETWEEN $l_dag_from AND $l_dag_to and date_end BETWEEN $l_dag_from AND $l_dag_to ORDER BY date_start ASC LIMIT 1; $dagpris = mysql_result(mysql_query($sql)) $price += ($dagpris)?$dagpris:$standardpris; ![]() |
|||
![]() |
![]() |
![]() |
#3 | ||
|
|||
Mycket flitig postare
|
Så här är det. ( Alltid problem att få med all info på första posten
![]() Bygger ett bokningssystem Varje rum kan ha olika priser i olika datumintervaller, och när jag räknar ut priset måste jag alltså ta i aktning att bokad period kan innefatta flera av datumintervallen. Det innebär att jag måste hämta priset för varje dag och addera det till totalsumman. Exempel: Dag 1: 550:- (ingår i datumintervall) Dag 2: 550:- (ingår i datumintervall) Dag 3: 550:- (ingår i datumintervall) Dag 4: 400:- (standardpris då detta datum inte ingår i något intervall) Dag 5: 400:- (standardpris då detta datum inte ingår i något intervall) Totalpris: 2450:- Hmm... |
||
![]() |
![]() |
![]() |
#4 | ||
|
|||
Mycket flitig postare
|
Finns ju några olika varianter att lösa problemet. Generellt inom programmering gäller ofta att snabbare algoritmer kräver mer minne, medan minneseffektiva algoritmer går något långsammare.
I detta fallet skulle man exempelvis istället för att lägga en post i databasen med en tidsperiod istället lägga en post per dag. Det skulle kräva fler rader i databasen, men blir mycket enklare att få fram summan genom att helt enkelt bara summera alla rader som faller inom intervallet. Du vet dessutom hur många träffar du får i databasen på aktuellt intervall, ta då antal dagar som saknas upp till det aktuella antalet dagar och multiplicera med standardpriset... Summan ger totalpriset. Om man kan anta att vissa villkor gäller, exempelvis att standardpriset alltid är lägre än intervallpriset eller liknande så går det säkert klura ut nån fiffig algoritm också. Kanske är det avvikelsen mot standardpriset man ska ha i databasen? Då skulle totalpriset bli antal*standardpriset+summan från databasfrågan. SELECT SUM(`price`-$standardpris) FROM tbl WHERE... Jag ger dig kanske inte det svaret du ville ha, men ledtrådar på hur man kan tänka. |
||
![]() |
![]() |
![]() |
#5 | ||
|
|||
Klarade millennium-buggen
|
Lindahl har helt rätt.
Du har antagligen optimerat på fel sak. Ditt system verkar vara optimerat på "lätt att lägga in nya specialpriser" Det borde vara optimerat på "lätt att söka fram priser för användaren". Tänk själv. Hur ofta uppdaterar du med nya priser? En gång i veckan/månaden typ. Hur ofta söker användarna efter vad rummen kostar? Hela tiden, hundratals och tusentals gånger om dagen. Som tur är går det antagligen att bygga in en sådan optimering genom en ny tabell, som innehåller alla tänkbara sökbara datum framåt i tiden, hur långt bestämmer du själv, kategori och prisnivå för varje kategori och datum. Enklast är kanske att fylla den tabellen med innehåll vid varje ny uppdatering av tabellen med erbjudanden och tidsperioder. Du kan behöva tömma tabellen innan för att få bort alla gamla erbjudanden. Sen blir SQL-frågan löjligt enkel. I ett sådant system kan du också ta hänsyn till att ebjudanden lappar över varandra och ta fram det billigaste priset för varje dag. |
||
![]() |
![]() |
Svara |
|
|