您好我正在尝试为MySQL编写正确的查询,以便根据同一个表中唯一的2列,从4列(从,到,内容,日期或所有内容,如果这更容易)中检索值。这个想法是检索用户X发送和接收的最后消息的列表
表
msg_id|msg_from|msg_to|msg_new|msg_content|date
1 user1 sw1 1 message1 2014-02-06
2 user1 sw1 1 message2 2014-02-06
3 user1 sw3 0 message3 2014-02-06
4 user1 sw5 0 message4 2014-02-06
5 sw2 sm2 1 message5 0000-00-00
6 sw2 sm4 1 message6 2014-02-20
7 sw1 user1 1 message7 2014-02-20
8 user1 sw5 1 message8 2014-02-20
我的最后一次尝试:
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
答案 0 :(得分:1)
如果我正确理解您的问题,此查询应该返回您需要的内容:
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(日期)
请参阅小提琴here。
答案 1 :(得分:0)
基本上,您需要使用另一个查询来包装它,因为您的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
这将根据日期返回结果中的最新条目。
答案 2 :(得分:0)
如果您只想查看上一封电子邮件返回的单个记录,例如您的示例节目,那么应该这样做......
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