在mysql中有两个字段的GROUP BY

时间:2012-08-19 19:23:47

标签: mysql group-by

我在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)视为一个?

提前致谢。

3 个答案:

答案 0 :(得分:8)

您可以使用新的自定义字段,按自定义规则排序ID(from_memberIDto_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。

最后,您可以按此值进行分组并获得唯一组合。

答案 1 :(得分: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

答案 2 :(得分:0)

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

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

现在我们想要将对话组合在一起,这意味着通过没有ID = 205的用户的ID。我们可以通过使用IF语句来实现这一点。 IF以这种方式工作: IF(条件,值-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 otherIDORDER 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

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

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;