Mysql查询将两个列合并,并获得两个列的唯一值
我就是不知道怎么做下面的事情 我拥有的 。。。mysql表中的“邮件”如下所示: 我需要什么Mysql查询将两个列合并,并获得两个列的唯一值,mysql,sql,Mysql,Sql,我就是不知道怎么做下面的事情 我拥有的 。。。mysql表中的“邮件”如下所示: 我需要什么 SELECT DISTINCT sender,recipient FROM mails WHERE recipient=1 OR sender=1 ORDER BY date DESC 。。。是获取一个人的最新聊天伙伴概览,比如id为1(用户也可以向自己发送消息)的用户,比如 无论用户是收件人还是发件人,也不管发送或接收了多少邮件。(我在示例输出中包括date列以澄清我需要按date DESC排序,它
SELECT DISTINCT sender,recipient
FROM mails
WHERE recipient=1 OR sender=1
ORDER BY date DESC
。。。是获取一个人的最新聊天伙伴概览,比如id为1
(用户也可以向自己发送消息)的用户,比如
无论用户是收件人还是发件人,也不管发送或接收了多少邮件。(我在示例输出中包括date列以澄清我需要按date 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
如果我添加按发件人分组
,则不会显示用户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
结果
我有点绝望。任何帮助都很好。使用子查询获取每个
收件人的最大日期,然后加入:
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
使用子查询获取每个收件人的最大日期,然后加入自身:
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
我认为您需要这样的聚合:
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);
我认为您需要这样的聚合:
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是唯一收件人而不是发件人的合作伙伴:(我在和处添加邮件m
中的和DESC
后效果很好:)非常感谢!其中1 in(m.recipient,m.sender)和(m.recipient=1或m.sender=1)是相同的吗?@rocks…它们是相同的。在我在和处添加邮件m
中的和DESC
后效果很好:)非常感谢(m.recipient,m.sender)和(m.recipient=1或m.sender=1)是相同的?@rocks…它们是相同的。