Et problem, som jeg umiddelbart ser, er at bruge en tidsstempeldatatype for datoen, dette vil komplicere din sql-forespørgsel af to grunde - du bliver nødt til at bruge et interval eller konvertere til en faktisk dato i din where-klausul, men endnu vigtigere , da du oplyser, at du er interesseret i dagens lukkekurs og gårsdagens lukkekurs, bliver du nødt til at holde styr på de dage, hvor markedet er åbent - så mandagens forespørgsel er anderledes end tirs - fre, og enhver dag markedet er lukket kl. en ferie skal også medregnes.
Jeg ville tilføje en kolonne som mktDay og øge den hver dag, markedet er åbent. En anden fremgangsmåde kan være at inkludere en 'forrigeLuk'-kolonne, som gør din beregning triviel. Jeg er klar over, at dette krænker normal form, men det sparer en dyr selvdeltagelse i din forespørgsel.
Hvis du ikke kan ændre strukturen, så vil du lave en selvtilslutning for at få gårsdagens tætte, og du kan beregne %-ændringen og rækkefølgen med den %-ændring, hvis du ønsker det.
Nedenfor er Erics kode, ryddet lidt op, den blev udført på min server, der kører mysql 5.0.27
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_today.price > 0
and p_yest.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10
Bemærk tilbagekrydsningen, da nogle af dine kolonnenavne og Erics aliaser var reserverede ord.
Bemærk også, at brug af en where-klausul til den første tabel ville være en billigere forespørgsel - where get'et udføres først og skal kun forsøge at selv joine på rækker, der er større end nul og har dagens dato
select
p_today.`ticker`,
p_today.`date`,
p_yest.price as `open`,
p_today.price as `close`,
((p_today.price - p_yest.price)/p_yest.price) as `change`
from
prices p_today
inner join prices p_yest on
p_today.ticker = p_yest.ticker
and date(p_today.`date`) = date(p_yest.`date`) + INTERVAL 1 DAY
and p_yest.price > 0
where p_today.price > 0
and date(p_today.`date`) = CURRENT_DATE
order by `change` desc
limit 10