Kom ihåg mig?
Home Menu

Menu


SQL - allt i en fråga

Ämnesverktyg Visningsalternativ
Oläst 2008-11-29, 21:38 #1
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
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
För de datum som inte omfattas av denna tabell finns ett "standardpris".
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;

}
Hur kan jag göra detta bättre (bara SQL) ?
Har gjort om mina fem andra queries till ett enda.
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-11-29, 23:12 #2
coredevs avatar
coredev coredev är inte uppkopplad
Bara ett inlägg till!
 
Reg.datum: Sep 2007
Inlägg: 1 554
coredev coredev är inte uppkopplad
Bara ett inlägg till!
coredevs avatar
 
Reg.datum: Sep 2007
Inlägg: 1 554
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;
Eller så är det helt tokigt.. svårt att säga
coredev är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-11-29, 23:22 #3
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
qson qson är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Sep 2006
Inlägg: 513
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...
qson är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-11-29, 23:51 #4
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
Lindahl Lindahl är inte uppkopplad
Mycket flitig postare
 
Reg.datum: Dec 2004
Inlägg: 854
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.
Lindahl är inte uppkopplad   Svara med citatSvara med citat
Oläst 2008-11-30, 11:11 #5
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
Magnus_A Magnus_A är inte uppkopplad
Klarade millennium-buggen
 
Reg.datum: May 2006
Inlägg: 2 604
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.
Magnus_A är inte uppkopplad   Svara med citatSvara med citat
Svara


Aktiva användare som för närvarande tittar på det här ämnet: 1 (0 medlemmar och 1 gäster)
 

Regler för att posta
Du får inte posta nya ämnen
Du får inte posta svar
Du får inte posta bifogade filer
Du får inte redigera dina inlägg

BB-kod är
Smilies är
[IMG]-kod är
HTML-kod är av

Forumhopp


Alla tider är GMT +2. Klockan är nu 00:13.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson
 
Copyright © 2017