如果在MySQL中进行交换,如何删除具有两个相同列值的行

时间:2019-12-31 01:39:23

标签: mysql

我是SQL新用户,需要您的帮助!我正在基于SQL数据库进行关系图分析,这是我唯一可以利用的资源。

我有这张桌子:

+-------+--------------+--------------+--------+
| name  | has_rel_with | relationship | weight |
+-------+--------------+--------------+--------+
| Tom   | Jerry        | friends      |     50 |
| Tom   | Jerry        | enemies      |     90 |
| Jerry | Tom          | enemies      |     90 |
| Jerry | Tom          | friends      |     50 |
| Rick  | Morty        | grandpa      |     50 |
| Morty | Rick         | enemies      |     50 |
| Rick  | Beth         | father       |    100 |
+-------+--------------+--------------+--------+


我想要一张表格,其中两个人之间的复杂关系减少为由最大权重定义的单个关系。因此,汤姆和杰里同时是朋友和敌人,但由于成为敌人比成为朋友更重,所以我只会保留敌人的记录。然后,汤姆有一个叫杰里的敌人,从字面上说杰里有一个叫汤姆的敌人,所以我也想删除这些重复项。

Name       Has_rel_with      relationship     weight
----------------------------------------------------
Tom        Jerry             enemies          90
Rick       Morty             grandpa          50
Rick       Beth              father           100


里克和莫蒂和爷爷和敌人一样重,我可以接受。因此结果表也可能如下所示:

Name       Has_rel_with      weight
--------------------------------------
Tom        Jerry             90
Rick       Morty             50
Rick       Beth              100

我尝试将CONCAT(name,has_rel_with)用作ID,但没有帮助。希望这段创建表代码可以节省您一些时间。

CREATE TABLE tmp (
      name varchar(20)
    , has_rel_with varchar(20)
    , relationship varchar(50)
    , weight int(3)
);
INSERT INTO tmp VALUES ("Tom", "Jerry", "friends", 50);
INSERT INTO tmp VALUES ("Tom", "Jerry", "enemies", 90);
INSERT INTO tmp VALUES ("Jerry", "Tom", "enemies", 90);
INSERT INTO tmp VALUES ("Jerry", "Tom", "friends", 50);
INSERT INTO tmp VALUES ("Rick", "Morty", "grandpa", 50);
INSERT INTO tmp VALUES ("Morty", "Rick", "enemies", 50);
INSERT INTO tmp VALUES ("Rick", "Beth", "father", 100);

1 个答案:

答案 0 :(得分:0)

我相信这就是您想要的:

select if(name > has_rel_with, name, has_rel_with) as Name,
       if(name > has_rel_with, has_rel_with, name) as Has_rel_with,
       max(weight) as weight from tmp group by 1,2;

这将为您提供您所描述的第二张桌子。它将名称标准化,因此列namehas_rel_with将始终按顺序具有两个名称。然后,它按namehas_rel_with分组,并为该分组提供最高的weight