我有一个名为personxmessage的MySQL表,从电子邮件中提取。它有三个字段,id(主键),MessageID和PersonID。对于MessageID引用的每条消息,有两条或更多条记录,每条记录都包含电子邮件中包含的人员的PersonID(即发件人,发送给或cc)。
我想查询此表以获取链接列表,其中显示链接到给定PersonID = XXXX的所有人员,以及他们之间的链接通过包含在包含XXXX的电子邮件中定义,最好包括权重显示出现次数的链接。另一种说法是,在图表术语中,我正在尝试获取XXXX的neighborhood。例如,对于
这样的条目MID PID
1 1
1 2
1 3
2 1
2 2
3 1
3 3
3 4
对于PersonID 1,我想获得链接列表
P1 P2 Count
1 1 3
1 2 2
1 3 2
1 4 1
2 3 1
3 4 1
是否可以通过某种自我加入来实现这一目标?如果是这样,我会使用什么查询?我已经完成了一些更简单的连接(例如,获取XXXX的星图和其他与电子邮件上的XXXX一起使用的PersonID),但这个是我的头脑。
答案 0 :(得分:1)
你可以使用GROUP_CONCAT
做某种类似的事情。它不是一个表,而是每个中间相关pid的结果集。
select mid, group_concat(distinct pid order by pid separator ', ') as related_ppl
from personxmessage
group by mid;
<强>结果强>
mid related_ppl
1 1, 2, 3
2 1, 2
3 1, 3, 4
我认为这是你正在寻找的东西:
select p.pid as pid1, pp.pid as pid2, count(*) as cnt
from personxmessagep
left join personxmessagepp
on p.mid = pp.mid
and p.pid < pp.pid
group by p.pid, pp.pid;
<强>结果强>
pid pid2 cnt
1 2 2
1 3 2
1 4 1
2 1
2 3 1
3 1
3 4 1
4 1