SQL Server显示消息,如对话

时间:2011-12-30 14:54:49

标签: sql-server

我正在开发一个信息系统,我和消息中心。我想显示Outlook或Gmail“对话”等消息。

在我的留言表中,我有以下列:

  • MessageId(PK)
  • 日期
  • 来自(FK)
  • 至(FK)
  • 主题
  • 国家
  • 主题
  • ReplyId(FK),null

首先,我收到没有replyId的消息,以显示“最新”消息。

但是当我点击任何消息时,我都没有得到对话...... :(

任何人都可以帮我查询?

提前致谢

编辑: 我在表格中添加了一个额外的字段,即最后一次回复会话的ID,这样我就可以同时收到所有对话消息了!

:)

3 个答案:

答案 0 :(得分:1)

您想使用CTE来完成此操作,这实际上是一个父子查询:

declare @MessageId int = 3;

with Conversations as
(
    select
        MessageId,
        [Date],
        [From],
        [To],
        Body,
        [Subject],
        [State],
        ReplyId,
        CAST(MessageId as varchar(max)) + '-' as hierarchy,
        CAST(MessageId as varchar(max)) + '-' as TopMessageId
    from
        Messages
    where
        replyid is null
    union all
    select
        m.MessageId,
        m.[Date],
        m.[From],
        m.[To],
        m.Body,
        m.[Subject],
        m.[State],
        m.ReplyId,
        c.hierarchy + CAST(m.MessageId as varchar(max)) + '-' as hierarchy,
        c.TopMessageId
    from
        Conversations c
        inner join Messages m on
            c.MessageId = m.ReplyId
)

select
    c2.MessageId,
    c2.[Date],
    c2.[From],
    c2.[To],
    c2.Body,
    c2.[Subject],
    c2.[State],
    c2.ReplyId
from
    Conversations c1
    inner join Conversations c2 on
        c2.hierarchy like c1.TopMessageId + '%'
where
    c1.MessageId = @MessageId
order by c2.[Date] desc

如果您使用的是SQL Server 2008,则可能需要在表格中使用hierarchyid列来避免CTE一起使用。

答案 1 :(得分:0)

我认为您正在寻找的是使用sql server进行递归,因为您希望将对话作为子父关系。

答案 2 :(得分:0)

我写了这个,这是一个简单的聊天转换:

 session_start();
 $regreg = $_SESSION['username'];
 $fgetrhge = $_GET['with'];

 $pdo = new PDO('mysql:host=localhost;dbname=TESTDB', 'TESTUSER', 'TESTPASS');

 $sql = "SELECT an, von, message, time FROM messages ORDER BY time ASC";

 foreach ($pdo->query($sql) as $row) {

 if($_SESSION['username'] == $row['von'] && $_GET['with'] == $row['an']) {
 echo '<div align="right">
 <div class="own">

 <span style="margin-right:18px;" class="nmespn">DU</span>
 <img src="http://YOURDOMAIN.NET/profileicons/'.$regreg.'" class="pbmspna" onerror="this.onerror=null;this.src='."'http://crashhd.de/no_pic.png'".';">
 <div style="float:left;padding-top:2px;" align="left">
 <span class="tmespn">'.$row['time'].'</span>
 </div>
 <br><br>
 <div align="left" style="margin-left:14px" class="msgspn">
 <span>'.$row['message'].'</span>
 </div>

 </div>
 </div>
 <br>';
}
 else if($_GET['with'] == $row['von'] && $_SESSION['username']  == $row['an']) {

 echo '<div align="left">
 <div align="left" class="partner">
 <img src="http://YOURDOMAIN.NET/profileicons/'.$row['von'].'" class="pbmspna" onerror="this.onerror=null;this.src='."'http://crashhd.de/no_pic.png'".';">
 <span class="nmespn" style="cursor:pointer;">'.$row['von'].'</span>
 <div style="float:right;padding-right:6px;" align="right">
 <span class="tmespn">'.$row['time'].'</span>
 </div>
 <br><br>
 <div class="msgspn">
 <span>'.$row['message'].'</span>
 </div>
 </div>
 </div>
 <br>';
    }
 }

 // an = to; von = from; sry im german :D

我希望我能提供帮助:)。