MySQL更新连接查询解决重复值

标签 mysql foreign-keys relational-database junction-table

我有一个类别表,其中有一些重复的类别,如下所述,

`Categories`
+========+============+============+
| cat_id | cat_name   | item_count |
+========+============+============+
|      1 | Category 1 |         2  |
|      2 | Category 1 |         1  |
|      3 | Category 2 |         2  |
|      4 | Category 3 |         1  |
|      5 | Category 3 |         1  |
+--------+------------+------------+

这是与另一个 Items 表相关的另一个联结表。第一个表中的 item_count 是每个 cat_id 的项目总数。

`Junction`
+========+=========+
| cat_id | item_id |
+========+=========+
|      1 |     100 |
|      1 |     101 |
|      2 |     102 |
|      3 |     103 |
|      3 |     104 |
|      4 |     105 |
|      5 |     106 |
+--------+---------+

如何将重复类别中的这些项目添加或组合到每个重复项中具有最大 item_count 的项目中? (例如 类别 1)。

此外,如果 item_count 与那些重复的相同,那么将选择具有最大 cat_id 的类别,并且 item_count 将是合并到那个记录。 (例如 类别 3)。

Note: Instead of removing the duplicate records, the item_count will be set to 0.

下面是预期的结果。

+========+============+============+
| cat_id | cat_name   | item_count |
+========+============+============+
|      1 | Category 1 |         3  |
|      2 | Category 1 |         0  |
|      3 | Category 2 |         2  |
|      4 | Category 3 |         0  |
|      5 | Category 3 |         2  |
+--------+------------+------------+

+========+=========+
| cat_id | item_id |
+========+=========+
|      1 |     100 |
|      1 |     101 |
|      1 |     102 |
|      3 |     103 |
|      3 |     104 |
|      5 |     105 |
|      5 |     106 |
+--------+---------+

在结果中,有两个重复项 Category 1Category 3。我们有 2 个场景,

  1. cat_id=2被淘汰是因为它的item_count=1小于 cat_id=1item_count=2
  2. cat_id=4 被淘汰了,即使它的 item_count 是一样的 作为 cat_id=5 因为 5 是重复项中的最大值 类别 3

如果有任何查询可以连接和更新两个表以解决重复问题,请帮助我。

最佳答案

这是一个选择。你可以想办法让它适应更新;-)

为了简单起见,我忽略了连接表

SELECT z.cat_id
     , z.cat_name
     , (z.cat_id = x.cat_id) * new_count item_count
  FROM categories x 
  LEFT 
  JOIN categories y 
    ON y.cat_name = x.cat_name 
   AND (y.item_count > x.item_count OR (y.item_count = x.item_count AND y.cat_id > x.cat_id))
  LEFT
  JOIN 
     ( SELECT a.cat_id, b.*
         FROM categories a
         JOIN 
            ( SELECT cat_name, SUM(item_count) new_count, MAX(item_count) max_count FROM categories GROUP BY cat_name) b
           ON b.cat_name = a.cat_name
     ) z
    ON z.cat_name = x.cat_name
 WHERE y.cat_id IS NULL;

+--------+------------+------------+
| cat_id | cat_name   | item_count |
+--------+------------+------------+
|      1 | Category 1 |          3 |
|      2 | Category 1 |          0 |
|      3 | Category 2 |          2 |
|      4 | Category 3 |          0 |
|      5 | Category 3 |          2 |
+--------+------------+------------+

关于MySQL更新连接查询解决重复值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33896553/

相关文章:

MySQL ON UPDATE/ON DELETE CASCADE not CASCADEing

mysql - 关系数据库中的链修改

mysql - 映射到另一个表(其实际值保存在 MySQL 中)的表的效率

mysql - 数据库设计 : saving Google Maps data

SQL 按计时器重复事件

mysql - 查询 mysql 时的撇号

MySQL - 索引 innodb 外键

mysql - SQL 和外键的逻辑问题

sql - 用于搜索 CSV(或类似数组)的 MySQL 命令

mysql - 通过另外一张表进行SQl查询