Mysql Query结合了两个列并获得两者的唯一值

时间:2016-08-08 10:24:26

标签: mysql sql

我无法弄清楚如何执行以下操作。

我有什么

...是一个mysql表“邮件”,如:

id | sender | recipient | date                 | content | read
---------------------------------------------------------------
1  | 3      | 2         | 2016-07-29 09:04:21  | hello   | 1
2  | 2      | 3         | 2016-07-29 09:14:21  | hello   | 1
3  | 1      | 2         | 2016-07-29 09:24:21  | hello   | 1
4  | 1      | 3         | 2016-07-29 09:34:21  | hello   | 0
5  | 1      | 1         | 2016-07-29 09:44:21  | hello   | 1
6  | 3      | 1         | 2016-07-29 09:54:21  | hello   | 0
7  | 1      | 1         | 2016-07-29 09:56:21  | hello   | 1
8  | 1      | 3         | 2016-07-29 09:58:21  | hello   | 0
9  | 2      | 2         | 2016-07-29 09:59:21  | hello   | 0

我需要什么

...是为了获得一个人的最新聊天伙伴的概述,比如身份1的用户(用户也可以向自己发送消息),如

date                | partner
2016-07-29 09:58:21 | 3
2016-07-29 09:56:21 | 1
2016-07-29 09:24:21 | 2

无论用户是收件人还是发件人,无论发送或接收了多少邮件。 (我在示例输出中包含了日期列以澄清我需要按日期DESC排序,它不需要包含在最终结果中)

我尝试了什么

SELECT DISTINCT sender,recipient
FROM mails
WHERE recipient=1 OR sender=1
ORDER BY date DESC

但当然它没有合并两列。输出

sender | recipient
1      | 3
1      | 1
3      | 1
1      | 2

如果我添加GROUP BY sender,则不显示用户1仅为收件人的邮件。

我也试过以下

SELECT
    max(date) as d,
    CONCAT(greatest(sender,recipient),"_",least(sender,recipient)) AS p
FROM mails
WHERE recipient=1 OR sender=1
GROUP BY p ORDER BY d DESC

,例如,给出

d                   | p
2016-07-29 09:58:21 | 3_1
2016-07-29 09:56:21 | 1_1
2016-07-29 09:24:21 | 2_1

什么似乎很棒,我只能把第一个ID显示出来...... 但是当我查找用户ID 2时,它会给出

d                   | p
2016-07-29 09:59:21 | 2_2
2016-07-29 09:24:21 | 2_1
2016-07-29 09:14:21 | 3_2

...所以不清楚第一个或第二个id是否是合作伙伴的id。

结果

我有点绝望。任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

我想你想要这样的聚合:

select max(date) as date,
       (case when m.recipient = 1 then m.sender else m.recipient end) as partner
from mails
where 1 in (m.recipient, m.sender)
group by (case when m.recipient = 1 then m.sender else m.recipient end)
order by max(date);

答案 1 :(得分:1)

使用子查询获取每个recipient的最大日期,然后加入自己:

select m.`recipient` as partner, m.`date`
from mails m
join (
    select max(`date`) as `date`, `recipient`
    from mails
    where sender = '1'
    group by `recipient`
) t
on m.`date` = t.`date` and m.`recipient` = t.`recipient`
where m.sender = '1'
order by m.`date` desc

Demo Here