Mysql 通过两列的组合获取唯一的行
拥有这个私人聊天桌Mysql 通过两列的组合获取唯一的行,mysql,sql,Mysql,Sql,拥有这个私人聊天桌 在我的信息页面上,我想显示最新的对话列表。列表将类似于如果am从pc发送消息到pc2和pc2发送回pc,那么它应该只显示一行 我试过这个问题 选择id、col2、col3、col4 从你的桌子上 col2、col3分组 但这会导致 更新: 我试过这个问题 从frmid=3466或toid=3466的tbl_主消息中选择* 按frmid分组,按tbl_primessagestimetempDESC 更新2 它应该是GROUP BY的SELECT use only字段中的两
在我的信息页面上,我想显示最新的对话列表。列表将类似于如果am从pc发送消息到pc2和pc2发送回pc,那么它应该只显示一行 我试过这个问题 选择id、col2、col3、col4 从你的桌子上 col2、col3分组强> 但这会导致 更新: 我试过这个问题 从frmid=3466或toid=3466的tbl_主消息中选择* 按frmid分组,按
tbl_primessages
timetempDESC
更新2
它应该是GROUP BY的SELECT use only字段中的两个最新时间加上一些聚合函数(计数、平均值、最小值、最大值等)
下面的查询使用了最小/最大技巧将涉及同一对用户的消息分组在一起。然后,我们可以保留每对人的最新对话
SELECT t1.*
FROM tbl_primessages t1
INNER JOIN
(
SELECT
LEAST(frmid, toid) AS frmid,
GREATEST(frmid, toid) AS toid,
MAX(timestamp) AS latest_ts
FROM tbl_primessages
GROUP BY LEAST(frmid, toid), GREATEST(frmid, toid)
) t2
ON LEAST(t1.frmid, t1.toid) = t2.frmid AND
GREATEST(t1.frmid, t1.toid) = t2.toid AND
t1.timestamp = t2.latest_ts
此处演示:
“那么它应该只显示一行。”-哪一行-为什么?@PaulSpiegel我想OP只是想在每对用户之间交换最新的消息。@TimBiegeleisen我猜也是这样。但如果OP在问题中澄清了这一点,那就更好了。这将是这两位@PaulSpiegelI的最新时间。我想你也应该在这个问题上找到
LEAST/magest
clause@PaulSpiegel谢谢你的编辑。在手机上回答这样的问题特别痛苦。这并不能回答问题。但是,您不能在ORDER BY子句中使用timestemp
,因为它未在GROUP BY.ORDER BY中列出。删除ORDER BY,谢谢@PaulSpiegel,只是从源查询中复制了它。
SELECT t1.*
FROM tbl_primessages t1
INNER JOIN
(
SELECT
LEAST(frmid, toid) AS frmid,
GREATEST(frmid, toid) AS toid,
MAX(timestamp) AS latest_ts
FROM tbl_primessages
GROUP BY LEAST(frmid, toid), GREATEST(frmid, toid)
) t2
ON LEAST(t1.frmid, t1.toid) = t2.frmid AND
GREATEST(t1.frmid, t1.toid) = t2.toid AND
t1.timestamp = t2.latest_ts