Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql查询将两个列合并,并获得两个列的唯一值_Mysql_Sql - Fatal编程技术网

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排序,它

我就是不知道怎么做下面的事情

我拥有的

。。。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
当然,它并没有将这两列结合起来。输出为

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…它们是相同的。