SELECT INNER JOIN语句中的MYSQL UPDATE

时间:2018-09-23 22:50:35

标签: php mysql

您好:)我对使用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,然后将联接中的该项更新为与左侧的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       |
+--------------------+---------+----------+---------+

因此,您可以看到在之前的列中,我最初发布的PhoneID-PhoneID关系表中的7、8和9都是重复的电话号码。查询后,我想使用PhoneID-PhoneID比较来检索重复项,并进行匹配,以上面直接显示的方式更改联接表。所以7、8、9都变成了5。因为5是原始数字,而7、8、9恰好是5的重复,所以我基本上将所有这些都指向5,然后删除原本是7的数字。我的电话表中的8、9都与5有新关系。这有意义吗? xD听起来很难听。

结束编辑

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

预先感谢任何人抽出宝贵时间来帮助我:)非常感谢。如果听起来很古怪,请告诉我,我将只使用多个查询。

0 个答案:

没有答案