获取表链接中两个表之间的最后一个链接,该链接使用SQL保存操作

时间:2014-07-23 11:42:31

标签: sql sql-server

我有两张桌子:人和音乐。我们之间有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中完成其余工作。

1 个答案:

答案 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
                  );