我的SQL查询根据两列中的唯一记录检索4列

时间:2014-02-20 17:57:25

标签: mysql

您好我正在尝试为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

3 个答案:

答案 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