2011-12-30 85 views
2

我正在開發一個信息系統,並且我已經和消息中心。我想顯示諸如Outlook或Gmail「對話」之類的消息。SQL Server顯示消息如對話

在我的消息表,我有以下欄目:

  • 的MessageId(PK)
  • 日期
  • 從(FK)
  • 要(FK)
  • 身體
  • 主題
  • 主題
  • ReplyId(FK),空

首先我得到沒有replyId,以顯示 「最新」 消息的消息。

但我不明白的談話,當消息的任何點擊... :(

任何一個可以幫助我查詢提前

感謝

編輯? 我添加一個額外的農田到餐桌,最後回覆到對話的ID,這樣我就可以在同一時間得到所有會話消息!

:)

+0

1.你能告訴您使用的是當前查詢? 2.答案可以是在談話中間的消息,還是僅在談話開始時?即,如果您搜索replyId = messageId,您是否會始終獲得所有答覆。 – mellamokb 2011-12-30 15:00:25

+0

我的查詢:從消息爲m 內加入消息作爲答覆上m.MessageId = reply.ReplyId 其中m.MessageId = @ messageId' 我 '聲明@messageId INT = 4 選擇答覆* 。只能得到對messageId = 4的回覆...但是,messageId = 1是回覆messageId = 2,messageId = 2回覆到messageId = 3,依此類推... 謝謝! – joaoasrosa 2011-12-30 15:07:40

+1

通常情況下,回覆消息中最好保留回覆的消息ID,而不是其他方式 - 當前模型允許兩條消息接收相同的回覆消息(有點不尋常),並且不會有消息不止一次地回覆 - 在這樣的模型中,對話中的原始消息具有空值,然後從那裏搜索回覆。讓對話中的每條信息*也參考原始信息可以改善事情。 – 2011-12-30 16:13:10

回答

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。

+0

感謝您的回覆。 我正在使用SQL Server 2008,但我從來沒有使用'hierarchyid' ...我要閱讀文檔。 :) – joaoasrosa 2011-12-30 16:32:20

0

我想你正在尋找的是使用sql server進行遞歸,因爲你希望你有對話作爲父子關係。

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 

我希望我能幫助:)