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发送消息到pc2pc2发送回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