| Re: MySQL inline view med statiske data |
|
 |
|
 |
|
 |
|
 |
Group: dk.edb.database · Group Profile
Author: Kristian Damm JensenKristian Damm Jensen Date: Apr 22, 2008 06:22
Michael Zedeler wrote:
> Morten wrote:
>> Hej, jeg har en applikation hvor brugeren vælger en dato range, fex.
>> 2008-04-01 til 2008-04-03. Denne benyttes til at tælle antal events
>> der var "åbne" på den givne dato, altså for hver dato some_date
>> findes events hvor "some_date BETWEEN events.start_date AND
>> events.end_date" Udfordringen er, at få datoerne sendt til MySQL, her er
>> en måde:
>>
>> SELECT date_range.some_day, COUNT(*)
>> FROM events, (
>> SELECT DATE('2008-04-01') AS some_day FROM DUAL UNION ALL
>> SELECT DATE('2008-04-02') FROM DUAL UNION ALL
>> SELECT DATE('2008-04-03') FROM DUAL
>> ) AS date_range
>> WHERE date_range.some_day BETWEEN events.start_date AND
>> events.end_date
>> GROUP BY 1
>
> Hvorfor ikke bare noget i denne stil?
>
> select count(*), date(events.start_date)
> from events
> where events.start_date between '2008-04-01' and '2008-04-03'
> group by date(events.start_date)
>
> Så kan du godt nok få huller med dage uden begivenheder, men dem må du
> fylde op selv.
Hvilket i øvrigt er relativt nemt:
create table dates(date datetime not null);
insert into dates values('2008-01-01');
insert into dates values('2008-01-02');
insert into dates values('2008-01-03');
...
select date(d.date), isnull(events.start_date, 0; count(*))
from dates d
left join events
on d.date = events.start_date
and d.date between '2008-04-01' and '2008-04-03'
group by date(events.start_date)
Jeg er ikke inde i detaljerne i MySQL. Tanken med isnull her er at hvis
events.start_date er NULL returneres 0, ellers antallet af poster. Dette fif
er nødvendigt fordi det ellers ikke er muligt at skelne mellem en dato der
ikke modsvares af nogen forekomst i events og en der svarer til netop én
post i events.
--
Venlig hilsen /Best regards
Kristian Damm Jensen
|