php - 来自 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 语句?我也在考虑循环这个输出并单独更新每一行,但我希望只使用一个查询来节省时间和代码。输入它让我觉得有点讨厌,但我希望那里有一个解决方案!
提前感谢任何人花时间帮助我:)我真的很感激。如果这听起来很奇怪,请告诉我我将只使用多个查询。
解决方案
推荐阅读
- java - 将字符串转换为 LocalDate
- wordpress - 将父级设置为单个自定义帖子(面包屑问题)
- scala - 将时间戳列与字符串列连接起来
- jsf - 如何在 JSF 中正确使用 commandButton?
- ajax - 覆盖 AJAX 请求的 generic.ListView 方法 DJANGO
- case - 针对 NULL 或 Argument 的 Where 子句测试中的 MS SQL 案例
- c# - 如何在 TableAdapter 上使用 join
- node.js - 使用参数验证创建 Mongoose Schema
- r - R使用映射函数或循环计算多个数据帧的新列
- laravel - Laravel队列工作者试图获取非对象的属性“id”