我无法弄清楚如何执行以下操作。
我有什么
...是一个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。
结果
我有点绝望。任何帮助都会很棒。
答案 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