2016-07-11 10 views
0

おはようございます!会話リスト付きSQL Serverメッセージシステム

私は人々がメッセージを交換できるようにするWebアプリケーションを開発しました。

Windows 2012 ServerでSQL Server 2008とClassic ASPを使用しています。簡単にするために

は、唯一の2つのテーブルがあるとします

tUsers 
    Id INT IDENTITY(1,1) 
    Username VARCHAR(20) 

tMessages 
    Id INT IDENTITY(1,1) 
    UserIdFrom INT 
    UserIdTo INT 
    SentDate DATETIME 
    Message VARCHAR(300) 
    Read TINYINT 

私の質問は簡単ですが、私は、MS SQLのための具体的な解決策を見つけることができません。

私と会話した他のユーザーとの会話リストを返すクエリを作成する必要があります。

リストユーザーIDユーザー名が含まれている必要があります(ない鉱山が、私はと話したユーザの)および送信日/時間順で逆の順序でなければならず、(からか、私には)メッセージを含める必要があります答えなしで(例えば、Whatsappとして)。

多くの解決策が見つかりましたが、MySQLではMS SQLへの変換が機能していません。これはSQLのヘルプが必要なのは初めてのことですが、自分で解決策を見つけることはできません。

誰も私の問題を解決するためにT-SQLクエリの例を教えてもらえますか?

私の英語は申し訳ありませんが、私はイタリア語を話しました。

これはStackOverflowに関する私の2番目の質問です。私はルールを尊重して願っています。

ありがとうございます。

+0

を使用すると、MySQLで動作するクエリを持っている場合、あなたの質問にそれを含めることが良いでしょう - とあまり変化があってはなりませんMSSQL – Jamiec

+0

代わりにIDEONE.COMを使用すると、SQLFiddleでテーブルを作成するとエラーが表示されますか?あなたは同じですか? – danylele

答えて

0
SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
FROM tMessages m 
INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
WHERE (t1.Username = 'danylele' AND t2.Username = 'yourFriend') OR 
     (t1.Username = 'yourFriend' AND t2.Username = 'danylele') 
ORDER BY m.SentDate DESC 

、ユーザーIDの代わりに、ユーザ名にしたい場合は、あなただけのこのWHERE句を使用することができます:あなたは彼のクエリを取ることができ@TimするH/Tで

WHERE (t1.Id = 'yourId' AND t2.Id = 'friendId') OR 
     (t1.Id = 'friendId' AND t2.Username = 'yourId') 
+0

@Jamiec私の質問が更新されました。これを念頭に置いても、無限の意見交換につながるわけではなく、おそらく途中でのダウンボトムを含んでいます。 –

+0

これは、私と私が話している他のすべてのユーザーとの会話リスト全体を取得するものではなく、ユーザー名ではなくユーザーIDを使用する必要があります。 – danylele

0

を、そして労働組合それがで他の人からへのメッセージを取得するために反対:

あなたはあなたがそのような

としてクエリを使用することができます持っていたすべての*会話のリストを取得したい場合
DECLARE @myUserId INT = 1 
SELECT DISTINCT Id, Username 
FROM 
(
    SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
    FROM tMessages m 
    INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
    INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
    WHERE t1.Id = @myUserId 
    UNION 
    SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
    FROM tMessages m 
    INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
    INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
    WHERE t2.Id = @myUserId 
) 
ORDER BY SentDate DESC 

あなたが特定の会話、使用中のすべてのメッセージたい場合:

DECLARE @myUserId INT = 1 
DECLARE @friendUserId INT = 2 
SELECT * FROM 
(
    SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
    FROM tMessages m 
    INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
    INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
    WHERE t1.Id = @myUserId AND t2.Id = @friendUserId 
    UNION 
    SELECT t2.Id, 
     t2.Username, 
     m.SentDate, 
     m.Message 
    FROM tMessages m 
    INNER JOIN tUsers t1 
    ON m.UserIdFrom = t1.Id 
    INNER JOIN tUsers t2 
    ON m.UserIdTo = t2.Id 
    WHERE t1.Id = @friendUserId AND t2.Id = @myUserId 
) 
ORDER BY SentDate DESC 
+0

注意:あなたの注文はそのまま「UNION」で生き残ることはできません。 –

+0

@TimBiegeleisenうん、それは不注意だった。 – Jamiec

+0

Whatsappのチャットリストのような1人のユーザーだけでなく、私が会話するすべてのユーザーとの会話のリスト全体を取得する必要があります。あなたのSQLは(friendUserIdで指定された)1人のユーザーしか得られないようです。 – danylele