【问题标题】:SQL Server messages system with conversation list带有对话列表的 SQL Server 消息系统
【发布时间】:2016-11-13 06:08:32
【问题描述】:

早上好!

我开发了一个网络应用程序,允许人们交换消息。

我在 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 的解决方案。

我需要编写一个查询,返回我和我与之交谈的其他用户之间的对话列表。

列表必须包含 UserIdUsername(不是我的,而是我与之交谈的用户),并且必须按照发送日期/时间的相反顺序排列,并且必须包括没有回答的消息(来自或给我)(例如 Whatsapp)。

我找到了许多解决方案,但对于 MySQL,无法转换为 MS SQL。这是我第一次在 SQL 方面需要帮助,但我自己找不到解决方案。

谁能给我一个 T-SQL 查询的例子来解决我的问题???

对不起我的英语,我以前说意大利语。

这是我关于 StackOverflow 的第二个问题。我希望我遵守了规则。

提前致谢。

【问题讨论】:

  • 如果您有一个在 MySql 中有效的查询,最好将其包含在您的问题中 - MSSQL 应该不会有太大变化
  • SQLFiddle 在创建表时给我一个错误...我可以改用 IDEONE.COM 吗?对你来说也一样?

标签: sql-server whatsapp messages


【解决方案1】:

通过向@Tim 发送 H/T,您可以接受他的查询,并将其与相反的查询联合,以便从另一个人那里获取消息给

如果您想检索所有*对话的列表,您可以使用查询,例如

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

【讨论】:

  • 小心:您的订单可能无法在UNION 完好无损的情况下保存。
  • @TimBiegeleisen 是的,这很粗心。
  • 我需要获取我的整个对话列表,不仅是与一个用户(如 Whatsapp 聊天列表),还包括与我交谈的所有用户。您的 SQL 似乎只有一个用户(用friendUserId 指定)。
  • @danylele - 您可能想查看您的问题。 I'd like to write a query that returns the conversation list, for example between me and other user I talked to.
  • @Jamiec - 第一个查询不起作用... SMS 结果是 Msg 156, Level 15, State 1, Line 27, 关键字“ORDER”附近的语法不正确。
【解决方案2】:
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 子句:

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

【讨论】:

  • @Jamiec 更新了我的查询。希望这不会导致无休止的 cmets 交换,可能包括一路上的反对票。
  • 这不会得到我和我交谈的所有其他用户之间的整个对话列表,我需要在查询中使用我的 UserId 而不是用户名。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 2010-09-20
  • 1970-01-01
  • 2011-01-18
  • 1970-01-01
相关资源
最近更新 更多