Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在mysql中合并对重复行的引用_Mysql - Fatal编程技术网

在mysql中合并对重复行的引用

在mysql中合并对重复行的引用,mysql,Mysql,这同时让人感觉非常简单和复杂,但我无法找到一种合适的方式来处理mysql查询 我有一个名为categories的标签表,它应该只有字段catu_title的唯一标题。但是,我注意到有多行具有相同的cat_标题字段名 我想删除除第一个副本以外的所有副本。很简单,是的。但是另一个表,tagging有一个名为tagging_cat_id的字段,该字段引用categories表中的标识符字段cat_id。删除重复项将断开这些引用,并且不指向任何内容 因此,更复杂的方面是查找任何引用将要删除的重复行的ta

这同时让人感觉非常简单和复杂,但我无法找到一种合适的方式来处理mysql查询

我有一个名为categories的标签表,它应该只有字段catu_title的唯一标题。但是,我注意到有多行具有相同的cat_标题字段名

我想删除除第一个副本以外的所有副本。很简单,是的。但是另一个表,tagging有一个名为tagging_cat_id的字段,该字段引用categories表中的标识符字段cat_id。删除重复项将断开这些引用,并且不指向任何内容

因此,更复杂的方面是查找任何引用将要删除的重复行的tagging_cat_id字段,并将其更改为引用此cat_标题的第一行(很快将是唯一的)

我是mysql的新手,这有点超出我的深度。我几乎想在gui中手动完成这项工作。是否有一种足够简单的查询方法,我可以偶尔运行以执行上述操作?(直到导致创建重复项的原因得到解决)。发行版是5.7.21

样本数据 类别

+--------+-----------+
| 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版本添加了代码,这一切如期而至。谢谢你的简短评论,我将通过我的方式来更好地理解这些技术。非常感谢。