SQL Query在日期之间连接表

时间:2014-06-24 03:58:13

标签: mysql sql

我有一个MySQL数据库,它记录了有两个表的寻呼机消息,一个是带有消息的表,另一个是带有接收者的表,其中表之间的链接是pagermessages.pcapcode = capcodes.bcapcode(一个数字地址)每个寻呼机消息都发送到)。

这是半井工作,我通常使用内部或左侧联接来显示各种寻呼机消息以及消息的用途。

我遇到的问题是,系统是动态的,并且可以对寻呼机进行重新编程,以便最终可能将接收方EXAMPLE1的地址1更改为示例2。

这导致问题,我想以历史形式存储消息,但我需要一种能够在日期范围之间指定的方法。我的想法是在Capcodes表中有一个日期&时间(bStartDateTime)和完成日期& time(bFinishDateTime)然后在我的查询中能够使用它来计算如何加入寻呼机消息。

这是我陷入困境的地方,我通常会做一些类似SELECT *来自PagerMessages INNER JOIN Capcodes ON PagerMessages.pCapcode = Capcodes.bCapcode但是我现在想要做的就是做同样的事情,但是寻呼机消息日期(pDateTime)在bStartDateTime和bFinishDateTime(可能是空白)之间进行链接,但如果它在那之外则不进行链接。

所以拿这个例子

寻呼机留言表

ID|pDateTime       |pCapcode|pMessage
1 |2014-06-24 14:00|1       |This is a test message
2 |2014-06-24 15:00|1       |This is a test message
3 |2014-06-24 16:00|2       |This is a test message

密码表

CapcodeID|pCapcode|Name     |bStartDateTime  |bFinishDateTime
1        |1       |Example 1|2014-06-24 14:00|2014-06-24 14:30
2        |1       |Example 2|2014-06-24 14:31|
3        |2       |Example 3|2014-06-24 14:31|

在上面的例子中,我希望能够加入表格,以便我可以得到如下表格:

ID|pDateTime       |pCapcode|Name     |pMessage
1 |2014-06-24 14:00|1       |Example 1|This is a test message
2 |2014-06-24 15:00|1       |Example 2|This is a test message
3 |2014-06-24 16:00|2       |Example 3|This is a test message

所以你可以看到,主要是因为capcode在pCapcode表中存在两次,所以它已经进入了日期&时间介于两者之间,这样我就可以在capcode表中拥有相同bCapcode的多个条目,然后如果它们被更改,只需在Capcodes表中添加它被更改的日期,并添加一个新条目而不是具有历史条目不再准确,因为我无法正确选择它们。

对不起,如果它没有多大意义,我可以澄清,如果需要,但我想我已经涵盖了我要求的大部分内容,这实际上是什么样的SQL语句将允许我做上面的事情,因为它我所看到的并不是一个简单的INNER / LEFT JOIN。

谢谢!

2 个答案:

答案 0 :(得分:0)

你仍然可以加入他们。只需确保仅使用完成时间(如果存在)。

select a.id, a.pdatetime, b.name, a.pmessage
from PageMessage a
join Capcode b on a.pcapcode = b.pcapcode and b.bstartdatetime <= a.pdatetime 
     and (b.bfinishdatetime is null or a.pdatetime <= b.bfinishdatetime);

答案 1 :(得分:-1)

select  ID,pdatetime,pcapcode,0 as 'Name',pmessage from Pager_Message 
union 
select  ID,0,pcapcode,name,0  from Capcode 
相关问题