MYSQL - 如何将2行相关数据合并为1行

标签 mysql

我是 mysql 的新手并试图研究它但找不到任何解决方案。我有一个这样的表:

    | SW_Pair1        | SW_Pair2        | Pair1_VLAN1| Pair1_VLAN2| Pair2_VLAN1| Pair2_VLAN2| Inter | Mgmt| OSPF| Env | Domain|
    |-----------------|-----------------|------------|------------|------------|------------|-------|-----|-----|-----|-------|
    | Switch1.abc.com | Switch2.abc.com | VLAN-111   | VLAN-333   | Unknown    |  Unknown   |   47  | 24  | 0.1 | Dev | abc   |
    | Switch2.abc.com | Switch1.abc.com | VLAN-222   | VLAN-444   | Unknown    |  Unknown   |   47  | 24  | 0.1 | Dev | abc   |
    | Switch3.abc.com | Switch4.abc.com | VLAN-121   | VLAN-123   | Unknown    |  Unknown   |   47  | 24  | 0.1 | Dev | abc   |
    | Switch4.abc.com | Switch3.abc.com | VLAN-515   | VLAN-717   | Unknown    |  Unknown   |   47  | 24  | 0.1 | Dev | abc   |
    | Switch5.abc.com | Switch6.abc.com | VLAN-919   | VLAN-101   | Unknown    |  Unknown   |   47  | 24  | 0.1 | Dev | abc   |
    | Switch6.abc.com | Switch5.abc.com | VLAN-105   | VLAN-108   | Unknown    |  Unknown   |   47  | 24  | 0.1 | Dev | abc   |
    | Switch7.abc.com | Switch8.abc.com | VLAN-110   | VLAN-115   | Unknown    |  Unknown   |   47  | 24  | 0.1 | Dev | abc   |
    | Switch8.abc.com | Switch7.abc.com | VLAN-199   | VLAN-200   | Unknown    |  Unknown   |   47  | 24  | 0.1 | Dev | abc   |

以前两行为例。
第 1 行中的 SW_Pair1 == 第 2 行中的 SW_Pair2 第 2 行中的 SW_Pair1 == 第 1 行中的 SW_Pair2

我将它们放在下一行,但它们可以在数据库中的任何位置。现在我想合并这两个,以便第 2 行的 Pair1_VLAN1 和 Pair1_VLAN2 中的数据进入第 1 行的 Pair2_VLAN1 和 Pair2_VLAN2,然后第 2 行消失。因此,这是合并后表的外观:

| SW_Pair1        | SW_Pair2        | Pair1_VLAN1| Pair1_VLAN2| Pair2_VLAN1| Pair2_VLAN2| Inter | Mgmt| OSPF| Env | Domain|
|-----------------|-----------------|------------|------------|------------|------------|-------|-----|-----|-----|-------|
| Switch1.abc.com | Switch2.abc.com | VLAN-111   | VLAN-333   | VLAN-222   |  VLAN-444  |   47  | 24  | 0.1 | Dev | abc   |
| Switch3.abc.com | Switch4.abc.com | VLAN-121   | VLAN-123   | VLAN-515   |  VLAN-717  |   47  | 24  | 0.1 | Dev | abc   |

等等..

我正在使用 python 2.7 将数据推送到 sql。

编辑:

我尝试在下面的查询中添加对 DELETE 的额外检查,但失败了:

UPDATE yourTable AS a
DELETE FROM yourTable AS b ON a.SW_Pair1 = b.SW_Pair2 AND a.SW_Pair2 = b.SW_Pair1
WHERE Pair2_VLAN1 IS Unknown;

或者更好的是,它可以在将数据移动到交换机 1 后设置第二个交换机的 Pair1_VLAN1 和 Pair1_VLAN2 行的值吗?也许将 vlan 改写为“MERGED”之类的东西。然后,我可以安全地删除 Pair1_VLAN1 和 Pair1_VLAN2 中具有“MERGED”的任何内容。我知道它只会说当它的数据成功移动到另一行时。

编辑 2:

nvm .. 想通了。见下文:

UPDATE yourTable AS a
JOIN yourTable AS b ON a.SW_Pair1 = b.SW_Pair2 AND a.SW_Pair2 = b.SW_Pair1
SET a.Pair2_VLAN1 = b.Pair1_VLAN1,
    a.Pair2_VLAN2 = b.Pair1_VLAN2,
    b.Pair1_VLAN1 = "MERGED",   
    b.Pair1_VLAN2 = "MERGED
WHERE a.SW_Pair1 < a.SW_Pair2;

最佳答案

首先用匹配行中的数据更新每对中的第一行:

UPDATE yourTable AS a
JOIN yourTable AS b ON a.SW_Pair1 = b.SW_Pair2 AND a.SW_Pair2 = b.SW_Pair1
SET a.Pair2_VLAN1 = b.Pair1_VLAN1,
    a.Pair2_VLAN2 = b.Pair1_VLAN2
WHERE a.SW_Pair1 < a.SW_Pair2;

WHERE 子句确保每对中只有一行(SW_Pair1 中名称较小的那一行)被更新。

然后删除未更新的行。它们在第一个查询更新的列中仍将具有 NULL

DELETE FROM yourTable
WHERE Pair2_VLAN1 IS NULL;

这假设所有内容都有匹配的行。如果您需要更安全的东西,您将需要进行连接以检查是否存在具有相反名称的匹配行。

DELETE a FROM yourTable AS a
JOIN yourTable AS b ON a.SW_Pair1 = b.SW_Pair2 AND a.SW_Pair2 = b.SW_Pair1
WHERE a.Pair2_VLAN1 IS NULL

关于MYSQL - 如何将2行相关数据合并为1行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46717332/

相关文章:

php - MySQL错误: 'invalid use of a group function'

php - mysql 查询慢 - IP 查找(禁止与否)

mysql - 返回最受欢迎的预订日

mysql - 为什么只有唯一/主键必须具有分区表的分区表达式中使用的所有列

c# - C# 应用程序中 where 子句中的未知列

PHP 和 MySQL : Formatting URLs correctly when using pagination to display images of multiple galleries

即使在索引后 MySQL 加入速度也很慢

mysql - 为什么会出现此 SQL 错误?

PHP PreparedStatements 字段名称

mysql - ON DUPLICATE KEY 添加行