首页 > 解决方案 > 来自 SELECT INNER JOIN 语句的 MYSQL UPDATE

问题描述

您好 :) 我对使用 INNER JOIN 还很陌生,但仍在尝试理解它的逻辑,我想我已经开始理解了。在浏览了有关该主题的几篇不同文章后,我生成了一个查询,用于在我的电话号码表中查找重复项。我的表结构是这样的:

+---------+-------+
| PhoneID | Phone |
+---------+-------+

很简单。我创建了这个查询:

SELECT A.PhoneID, B.PhoneID FROM T_Phone A
INNER JOIN T_Phone B
ON A.Phone = B.Phone AND A.PhoneID < B.PhoneID

它返回与另一部匹配的电话的 ID。我不知道如何正确表达,所以这里是一个示例输出:

+---------+---------+
| PhoneID | PhoneID |
+---------+---------+
|   17919 |   17969 |
|   17919 |   22206 |
|   17919 |   23837 |
|   17920 |   17970 |
|   17920 |   22203 |
|   17920 |   23834 |
|   17921 |   17971 |
|   17921 |   22225 |
|   17921 |   22465 |
|   17921 |   24011 |
|   17921 |   24047 |
|   17922 |   17972 |
|   17922 |   22198 |
|   17922 |   23879 |
|   17923 |   17973 |
|   17923 |   22199 |
|   17923 |   23880 |
+---------+---------+

您可以注意到左侧有重复的 ID,匹配的电话号码将在右侧(这些只是所述号码的 ID)。我想要完成的是实际更改相对于右侧 ID 的连接表。连接表结构如下:

+----------+-----------+
| T_JoinID | T_PhoneID |
+----------+-----------+

其中 T_JoinID 是一个更大的对象,其中包含这些 T_PhoneID 的集合,因此是连接表。我想要做的是从原始匹配查询中取一行,并在连接表中找到右侧的 PhoneID,然后将 Join 中的该项目更新为等于左侧的 PhoneID。对每一行重复此操作。

这是一种节省空间并摆脱匹配数字的方法,我可以将匹配的数字指向原始数字,并在需要检索它时将其用作参考。

之后,我需要实际删除我重置参考的原始数字,但是......这似乎是 2 或 3 个不同查询的工作。

编辑:对不起,我知道我没有提供足够的细节。以下是一些附加信息:我的确切表结构与此处不同,但我只使用我列出的列,所以我没有考虑其他任何一个都重要的事实。大多数表都有一个自动递增的唯一 ID。电话表有运营商、类型等列。我觉得包含的其他列无关紧要,但是如果有一个解决方案包含每个表的自动递增 ID,请告诉我:) 无论如何,我找到了一个解决方案,使用多个查询,但我仍然有兴趣学习并根据这个问题应用知识。所以我有一个我提到的那个连接表。对于预期的结果,它可能看起来像这样。表格中有一个前后表格,抱歉格式不正确。

+--------------------+---------+----------+---------+
| Join Table Results |         |          |         |
+--------------------+---------+----------+---------+
| Before             |         | After    |         |
| Join               | Table   | Join     | Table   |
| PersonID           | PhoneID | PersonID | PhoneID |
| 1                  | 1       | 1        | 1       |
| 1                  | 2       | 1        | 2       |
| 1                  | 3       | 1        | 3       |
| 2                  | 4       | 2        | 1       |
| 2                  | 5       | 2        | 5       |
| 2                  | 6       | 2        | 6       |
| 3                  | 7       | 3        | 5       |
| 3                  | 8       | 3        | 5       |
| 3                  | 9       | 3        | 5       |
| 3                  | 10      | 3        | 8       |
| 3                  | 11      | 3        | 9       |
+--------------------+---------+----------+---------+

所以你可以看到在之前的列中,7、8和9都是我最初发布的PhoneID-PhoneID关系表中的重复电话号码。在查询之后,我想使用 PhoneID - PhoneID 比较检索重复项并获取匹配项,以以我在上面直接显示的方式更改连接表。所以 7、8、9 都变成了 5。因为 5 是原来的数字,而 7、8、9 恰好是 5 的重复。所以我基本上都是把它们都指向 5,然后删除本来应该是 7 的数字, 8, 9 在我的电话表中,因为它们都与 5 建立了新的关系。这有意义吗?xD 把它打出来听起来很离谱。

结束编辑

如何改进查询以完成此任务?是否可以使用 UPDATE 语句?我也在考虑循环这个输出并单独更新每一行,但我希望只使用一个查询来节省时间和代码。输入它让我觉得有点讨厌,但我希望那里有一个解决方案!

提前感谢任何人花时间帮助我:)我真的很感激。如果这听起来很奇怪,请告诉我我将只使用多个查询。

标签: phpmysql

解决方案


推荐阅读