4

我在 mysql 中有一个表,它存储用户之间的消息。该表具有以下字段:

ID   from_memberID  to_memberID   message                 Date
+----+--------------+------------+-----------------------+-----------------------+
1         205          207         hello Peter           19/08/2012 20:00:00
2         207          205         Hi frank              19/08/2012 20:01:00
3         205          208         hello Jennifer        19/08/2012 20:10:00
4         207          210         hello Peter           19/08/2012 20:20:00

好吧,假设我只想从用户 205 的每个对话中获取最后一条消息

它应该得到寄存器 2 和 3,用户(205-207)和用户(205-208)之间的对话。事实是我使用 GROUP BY from_memberID 然后在我的结果中也添加了寄存器 ID=1。

这是使用的语句:

SELECT *
FROM
(SELECT msg.ID,
    msg.mensaje,
    msg.from_miembroID,
    msg.fecha,
    msg.read,
    FROM mensajes as msg
    INNER JOIN miembros as mem ON mem.ID=IF(msg.from_miembroID=205, msg.to_miembroID, msg.from_miembroID)
WHERE msg.to_miembroID=205 OR msg.from_miembroID=205
ORDER BY msg.fecha DESC) as temp
GROUP BY from_miembroID

我如何使用 GROUP BY 将两列(from_memberID、to_memberID)视为一列?

提前致谢。

4

3 回答 3

10

您可以使用新的自定义字段,按照自定义规则对 id ( from_memberID, to_memberID) 进行排序,例如,较小的总是在前。

例如:

SELECT 
     IF(from_memberID < to_memberID, 
         CONCAT(from_memberID, '-', to_memberID),
         CONCAT(to_memberID, '-', from_memberID)
     ) as conversation_ids
FROM `messages`

该字段将返回唯一的组合,例如 205-207,无论 205 向 207 发送消息还是 207 向 207 发送消息。

最后,您可以按此值分组并获得独特的组合。

于 2012-08-19T19:38:21.950 回答
0

为什么不简单地加入 ID 上的成员和消息表,只保留 from_miembroID = 205 和 to_miembroID = 205 的表,然后合并结果:

SELECT * FROM(
SELECT msg.ID,
       msg.mensaje,
       msg.from_miembroID as user,
       msg.fecha,
       msg.read,
FROM mensajes as msg INNER JOIN miembros as mem ON mem.ID=msg.from_miembroID
WHERE msg.from_miembroID=205
UNION
SELECT msg.ID,
       msg.mensaje,
       msg.from_miembroID,
       msg.fecha,
       msg.read,
FROM mensajes as msg INNER JOIN miembros as mem ON mem.ID=msg.to_miembroID
WHERE msg.to_miembroID=205
)
ORDER BY msg.date
LIMIT 1
于 2012-08-19T19:33:23.157 回答
0

好的,希望我理解正确,你想要什么。我会首先选择来自或发往当前用户(ID = 205)的每条消息,如下所示:

SELECT * FROM mensajes
WHERE (from_memberID=205 OR to_memberID=205)

现在我们想将对话分组在一起,这意味着用户的 ID 没有 ID=205。我们可以通过使用 IF 语句来实现这一点。IF 以这种方式工作:IF(condition,value-if-true,value-if-false)。所以我们创建了一个虚拟列otherID,其中包含对话伙伴 userid: IF(from_memberID=205,to_memberID,from_memberID) AS otherID。然后 SQL 看起来像这样:

SELECT 
  ID,
  IF(from_memberID=205,to_memberID,from_memberID) AS otherID,
  message,
  Date
FROM mensajes
WHERE (from_memberID=205 OR to_memberID=205)

现在我们只需要添加一个GROUP BY otherID和一个ORDER BY Date(最后一个帖子保存在一个组中):

SELECT 
  ID,
  IF(from_memberID=205,to_memberID,from_memberID) AS otherID,
  message,
  Date
FROM mensajes
WHERE (from_memberID=205 OR to_memberID=205)
GROUP BY otherID
ORDER BY Date

miembros现在我们可以使用上面的 SQL 作为子选择将它与表连接起来:

SELECT * FROM
    (SELECT 
      ID,
      IF(from_memberID=205,to_memberID,from_memberID) AS otherID,
      message,
      Date
    FROM mensajes
    WHERE (from_memberID=205 OR to_memberID=205)
    GROUP BY otherID
    ORDER BY Date) AS last
INNER JOIN miembros as mem ON mem.ID=lastotherID;
于 2012-08-19T19:54:32.913 回答