我有一张这样的桌子:
Sender Recipient NumMessages
-----------------------------
Vasya Petya 1
Petya Vasya 2
Eugen Petya 3
Petya Eugen 1
Masha Sveta 5
如何将这种表转换为一个表,其中任何对都只有一条记录,而该对也有NumMessages字段的总和?无论从一对记录中选择哪个。 这些将成为无向图的边缘。
我需要这个:
Node1 Node2 NumMessages
-----------------------------
Vasya Petya 3
Eugen Petya 4
Masha Sveta 5
如果可以使用,我的实际表中的发件人/收件人字段具有唯一标识符类型ID。 我试图将此表与自身连接起来并计算NumMesages的总和,但那又怎能在一对记录中只留下一条记录?
非常感谢
斯拉瓦
答案 0 :(得分:0)
这是一个使用case
排序的选项,其名称为:
select node1, node2, sum(nummessages)
from (
select case when sender < recipient then sender else recipient end as node1,
case when sender < recipient then recipient else sender end as node2,
nummessages
from yourtable
) t
group by node1, node2
答案 1 :(得分:0)
您需要为发件人和收件人成对的记录生成/查找共享密钥。
SELECT data.Id, SUM(data.NumMessage)
FROM (
SELECT CONCAT(Sender, Recipient) AS Id, NumMessages
FROM MessagePair
WHERE Sender > Recipient
UNION ALL
SELECT CONCAT(Recipient, Sender) AS Id, NumMessages
FROM MessagePair
WHERE Sender < Recipient
) data
GROUP BY data.Id