我在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)视为一个?
提前致谢。
答案 0 :(得分:8)
您可以使用新的自定义字段,按自定义规则排序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。
最后,您可以按此值进行分组并获得唯一组合。
答案 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 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
现在我们可以使用上面的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;