Mysql 我的SQL查询基于两列中的唯一记录检索4列
嗨,我正在尝试为MySQL编写一个正确的查询,根据同一个表中的两列是唯一的,从4列(from、to、content、date或all,如果更容易的话)检索值。其思想是检索用户X仅发送和接收的最后一条消息的列表 桌子 我最后一次尝试:Mysql 我的SQL查询基于两列中的唯一记录检索4列,mysql,Mysql,嗨,我正在尝试为MySQL编写一个正确的查询,根据同一个表中的两列是唯一的,从4列(from、to、content、date或all,如果更容易的话)检索值。其思想是检索用户X仅发送和接收的最后一条消息的列表 桌子 我最后一次尝试: SELECT t1.* FROM (SELECT MAX(msg_id) AS nr, msg_from, msg_to FROM com_msg GROUP BY msg_from) AS t2 INNER JOIN com_msg t1 ON
SELECT t1.* FROM (SELECT MAX(msg_id) AS nr, msg_from, msg_to
FROM com_msg GROUP BY msg_from) AS t2
INNER JOIN com_msg t1 ON t1.msg_from=t2.msg_from AND t1.msg_id=t2.nr
WHERE t1.msg_to='sw1' OR t1.msg_from='sw1'
返回:
2| user1|sw1 |1|message2|2014-02-06
7| sw1 |user1|1|message7|2014-02-20
但只应返回:
7| sw1 |user1|1|message7|2014-02-20
如果我正确理解了您的问题,此查询将返回您需要的内容:
SELECT com_msg.*
FROM com_msg INNER JOIN (SELECT MAX(msg_id) max_id
FROM com_msg
WHERE 'sw1' IN (msg_from, msg_to)
GROUP BY
CASE WHEN msg_from!='sw1' THEN msg_from
ELSE msg_to END) m
ON com_msg.msg_id = m.max_id
需要订购ID,否则应使用MAX(日期)
请参阅fiddle。基本上,您需要用另一个查询将其包装起来,因为where子句将显示to或from与用户相等的记录。我不是MySQL大师,但您应该能够做到以下几点:
select top 1 *
FROM (
SELECT t1.* FROM (
SELECT MAX(msg_id) AS nr, msg_from, msg_to
FROM com_msg
GROUP BY msg_from
) AS t2
INNER JOIN com_msg t1 ON t1.msg_from=t2.msg_from AND t1.msg_id=t2.nr
WHERE t1.msg_to='sw1' OR t1.msg_from='sw1'
)
ORDER BY date DESC
这将根据日期返回结果中最近的条目 如果您正在查找上一封电子邮件返回的一条记录,如您的示例所示,这应该可以
Select TOP 1 msg_from, msg_to, msg_content, date
From com_msg
Where msg_from='sw1' OR msg_to='sw1'
ORDER BY msg_id DESC
我很困惑。。。您最初的帖子说,“我们的想法是检索一个列表,其中只包含用户X发送和接收的最后一条消息”,但您的示例只显示了一条消息。您想要一条消息还是两条消息?我想您是在寻找每次对话的最后一条消息?在这种情况下,它只是一个,但可能还有更多?感谢您的输入,很抱歉混淆它实际上只是最后一个消息,不管它是由用户X发送或接收的,之前尝试过TOP 1查询,但每次都会出现MYSQL错误
Select TOP 1 msg_from, msg_to, msg_content, date
From com_msg
Where msg_from='sw1' OR msg_to='sw1'
ORDER BY msg_id DESC