我有两张桌子:个人和音乐。我在他们之间有一个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,并重新启动音乐2在12日。人2开始音乐1 11。
在这个表中,(IdPerson,IdMusic,Date)是唯一的。
如何使用SQL获取一个人在给定日期收听的音乐?
我认为,我们首先需要使用WHERE IdPerson=IdgivenPerson ORDER BY date,但之后我不再使用SQL来完成其余的工作。
发布于 2014-07-23 11:52:43
以下是一种方法:
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
);https://stackoverflow.com/questions/24909563
复制相似问题