需要帮助通过personid查找不同的行并仍然获取所有列

时间:2011-12-10 06:58:15

标签: sql

需要一些sql的帮助。我试图得到明显的frompersonid,但我想仍然选择所有的列。我也希望最终通过MessageDateTime订购它。

SELECT  [MessageID]
  ,[ToPersonID]
  ,[FromPersonID]
  ,[MessageText]
  ,[MessageDateTime]
  ,[ViewedByPerson]
FROM dbo.Message

编辑:

让我试着澄清一点。说我有一张包含这些值的表格。

messageid   toPerson   FromPerson   text
1           Andy       John         kdfjskjf
2           Andy       John         kdfjsdkj
3           Andy       Bob          kjfksdj

I am wanting to just display last message in the conversation between Andy and John so my results should be

messageid   toPerson   FromPerson
2           Andy       John
3           Andy       Bob

1 个答案:

答案 0 :(得分:3)

您显然正在使用MS SQL Server(或者可以想象为Sybase)。你真的不需要方括号;至少在我看来,它们严重限制了SQL的可读性。

您希望在给定的'FromPersonID'中看到哪些值?

你可以这样做:

SELECT MAX(MessageID)       AS MessageID,
       MIN(ToPersonID)      AS ToPersonID,
       FromPersonID         AS FromPersonID,
       MIN(MessageText)     AS MessageText,
       MAX(MessageDateTime) AS MessageDateTime,
       MIN(ViewedByPerson)  AS ViewedByPerson
  FROM politicprofiles.dbo.Message
 GROUP BY FromPersonID
 ORDER BY MessageDateTime

这有点任意选择一个值与给定的唯一'FromPersonID'相关联;一般来说,这些值不会来自单行数据,但您没有指定您想要一些代表性的数据行 - 只是您希望每个列都有一些值。

如果您考虑到哪些数据应该针对FromPersonID具有多个记录的情况显示数据,那么还有其他方法可以对查询进行编码。但是,您最终可能会执行子查询以为每个FromPersonID标识一条消息(可能基于最近的MessageDateTime),然后从主数据表中选择与FromPersonID和最新MessageDateTime匹配的行。那个PersonID:

SELECT M.MessageID,
       M.ToPersonID,
       M.FromPersonID,
       M.MessageText,
       M.MessageDateTime,
       M.ViewedByPerson
  FROM politicprofiles.dbo.Message AS M
  JOIN (SELECT FromPersonID, MAX(MessageDateTime) AS MessageDateTime
          FROM politicprofiles.dbo.Message
         GROUP BY FromPersonID) AS R
    ON M.FromPersonID = R.FromPersonID AND M.MessageDateTime = R.MessageDateTime
 ORDER BY M.MessageDateTime, FromPersonID