我有两张桌子:人和音乐。我们之间有N到N的连接。所以我需要一个介于它们之间的中间表。我也想保存它们之间连接的演变,所以我决定中间表会保存动作(开始听音乐,停止听音乐)
例如:
IdPerson | IdMusic | Start | DateTime
1 | 1 | true | 10/01/2014
1 | 2 | true | 10/01/2014
1 | 2 | false | 11/01/2014
2 | 1 | true | 11/01/2014
1 | 2 | true | 12/01/2014
此表表示人1开始听音乐1和2听第10,它停止音乐2到11,并在12日重启音乐2。人2在11日开始音乐。
在此表中,(IdPerson,IdMusic,Date)是唯一的。
如何使用SQL获取某个人在给定日期听的音乐?
我认为,我们首先需要使用WHERE IdPerson=IdgivenPerson ORDER BY date
,但在我现在不知道如何在SQL中完成其余工作。
答案 0 :(得分:1)
这是一种方法:
select c.idMusic
from Connections c
where c.IdPerson = IdgivenPerson and
c.datetime <= GivenDate
group by c.idMusic
having sum(case when start = 'true' then 1
when start = 'false' then -1
end) > 0;
它计算日期之前的开始和停止次数。当开始时间多于停止时,则返回音乐的ID。
编辑:
如果您只想要最后一个动作:
select c.*
from Connections c
where c.IdPerson = IdgivenPerson and
not exists (select 1
from Connections c2
where c2.IdPerson = c.IdgivenPerson and
c2.IdMusic = c.IdMusic and
c2.date > c.date and
c2.date <= GivenDate
);