在mysql中合并对重复行的引用
这同时让人感觉非常简单和复杂,但我无法找到一种合适的方式来处理mysql查询 我有一个名为categories的标签表,它应该只有字段catu_title的唯一标题。但是,我注意到有多行具有相同的cat_标题字段名 我想删除除第一个副本以外的所有副本。很简单,是的。但是另一个表,tagging有一个名为tagging_cat_id的字段,该字段引用categories表中的标识符字段cat_id。删除重复项将断开这些引用,并且不指向任何内容 因此,更复杂的方面是查找任何引用将要删除的重复行的tagging_cat_id字段,并将其更改为引用此cat_标题的第一行(很快将是唯一的) 我是mysql的新手,这有点超出我的深度。我几乎想在gui中手动完成这项工作。是否有一种足够简单的查询方法,我可以偶尔运行以执行上述操作?(直到导致创建重复项的原因得到解决)。发行版是5.7.21 样本数据 类别在mysql中合并对重复行的引用,mysql,Mysql,这同时让人感觉非常简单和复杂,但我无法找到一种合适的方式来处理mysql查询 我有一个名为categories的标签表,它应该只有字段catu_title的唯一标题。但是,我注意到有多行具有相同的cat_标题字段名 我想删除除第一个副本以外的所有副本。很简单,是的。但是另一个表,tagging有一个名为tagging_cat_id的字段,该字段引用categories表中的标识符字段cat_id。删除重复项将断开这些引用,并且不指向任何内容 因此,更复杂的方面是查找任何引用将要删除的重复行的ta
+--------+-----------+
| cat_id | cat_title |
+--------+-----------+
| 1 | green |
| 2 | red |
| 3 | blue |
| 4 | green |
| 5 | green |
| 6 | red |
| 7 | white |
+--------+-----------+
+--------+-----------+
| cat_id | cat_title |
+--------+-----------+
| 1 | green |
| 2 | red |
| 3 | blue |
| 7 | white |
+--------+-----------+
标记
+------------+-------------------+----------------+
| tagging_id | tagging_record_id | tagging_cat_id |
+------------+-------------------+----------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 7 |
| 4 | 3 | 5 |
| 5 | 4 | 6 |
| 6 | 5 | 4 |
| 7 | 5 | 3 |
| 8 | 6 | 5 |
+------------+-------------------+----------------+
+------------+-------------------+----------------+
| tagging_id | tagging_record_id | tagging_cat_id |
+------------+-------------------+----------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 7 |
| 4 | 3 | 1 |
| 5 | 4 | 2 |
| 6 | 5 | 1 |
| 7 | 5 | 3 |
| 8 | 6 | 1 |
+------------+-------------------+----------------+
我想将上述内容转换为以下内容:
类别
+--------+-----------+
| cat_id | cat_title |
+--------+-----------+
| 1 | green |
| 2 | red |
| 3 | blue |
| 4 | green |
| 5 | green |
| 6 | red |
| 7 | white |
+--------+-----------+
+--------+-----------+
| cat_id | cat_title |
+--------+-----------+
| 1 | green |
| 2 | red |
| 3 | blue |
| 7 | white |
+--------+-----------+
标记
+------------+-------------------+----------------+
| tagging_id | tagging_record_id | tagging_cat_id |
+------------+-------------------+----------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 7 |
| 4 | 3 | 5 |
| 5 | 4 | 6 |
| 6 | 5 | 4 |
| 7 | 5 | 3 |
| 8 | 6 | 5 |
+------------+-------------------+----------------+
+------------+-------------------+----------------+
| tagging_id | tagging_record_id | tagging_cat_id |
+------------+-------------------+----------------+
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 2 | 7 |
| 4 | 3 | 1 |
| 5 | 4 | 2 |
| 6 | 5 | 1 |
| 7 | 5 | 3 |
| 8 | 6 | 1 |
+------------+-------------------+----------------+
如果您的MySql版本为8.0+您可以使用以下查询:
SELECT cat_id, MIN(cat_id) OVER (PARTITION BY cat_title) min_id
FROM categories
要为每个cat\u id
标识具有相同cat\u标题的最小cat\u id
,以便更新表格:
WITH ids AS (
SELECT cat_id, MIN(cat_id) OVER (PARTITION BY cat_title) min_id
FROM categories
)
UPDATE tagging t
INNER JOIN ids i ON i.cat_id = t.tagging_cat_id
SET t.tagging_cat_id = i.min_id
然后可以删除重复项:
WITH ids AS (
SELECT cat_id, MIN(cat_id) OVER (PARTITION BY cat_title) min_id
FROM categories
)
DELETE c
FROM categories c INNER JOIN ids i
ON i.cat_id = c.cat_id AND i.min_id < c.cat_id
以及:
请参阅。
结果:
猫咪
类别名称
1.
绿色
2.
红色
3.
蓝色
7.
白色
问题和解决方案显而易见,问题是“你现在需要什么?”更快的算法?更安全的方式?自动化工具?你在看什么??不清楚。。如果您有合适的数据模型,则可以通过两个查询进行删除和更新。。因此,您应该添加适当的数据样本和预期的result@scaisEdge数据样本的最佳表达格式是什么?在两个表中显示与问题相关的一些示例行?抱歉,这真的不是我的领域,我很乐意展示javascript示例,但我不确定在这里演示相关表或数据库信息的最清晰的方式。如果您需要数据样本,并且预期结果为表格文本更好,则是:版本14.14发行版5.7。21@biscuitstack我为5.7Beautiful版本添加了代码,这一切如期而至。谢谢你的简短评论,我将通过我的方式来更好地理解这些技术。非常感谢。