如何合并MySQL数据库中的重复行,产品ID及其评级

时间:2013-05-22 20:10:54

标签: mysql sql group-by

我有一个数据库,其中包含5个客户提供的产品ID和评级。数据库中的每一行代表1条评论。它非常简单,并且产品ID和列中的1为1,2,3,4或5星的评论。它的布局如下:

Product ID | 1 | 2 | 3 | 4 | 5 |

1294518    | 1 | 0 | 0 | 0 | 0 |

9226582    | 0 | 0 | 1 | 0 | 0 |

3946583    | 0 | 0 | 0 | 1 | 0 |

7392588    | 1 | 0 | 0 | 0 | 0 |

1196585    | 0 | 0 | 0 | 0 | 1 |

1196585    | 0 | 0 | 0 | 0 | 1 |

我想合并我有重复产品ID的行。根据上面的示例,产品ID 1196585有两行。在这种情况下,我想将它组合成一行,在5列下有2行,以显示该产品已收到两个5星评价。

为了澄清我想要修改表格,以便组合重复的行,以便之后没有重复的产品ID,并且在每个第1,2,3,4和5列下面我留下了数字例如,这些产品ID中的每一个都收到了1,2,3,4和5星评价。

请问您能帮我理解如何通过SQL实现这一目标吗?

4 个答案:

答案 0 :(得分:2)

这是一个简单的聚合查询:

select ProductId, sum(Rate_1) as Rate_1, sum(Rate_2) as Rate_3, sum(Rate_3) as Rate_3,
       sum(Rate_4) as Rate_4, sum(Rate_5) as Rate_5
from t
group by ProductId

我使用标准字符将列的表面名称更改为名称。例如,1似乎是列的错误名称。

答案 1 :(得分:1)

要修改表格中的数据,您可以使用以下语句:

UPDATE product p
    INNER JOIN (
        SELECT "Product ID" as id,
               SUM(product."1") AS s1,
               SUM(product."2") AS s2,
               SUM(product."3") AS s3,
               SUM(product."4") AS s4,
               SUM(product."5") AS s5
        FROM product
        GROUP BY id
        HAVING count(*) > 1) sums
    ON p.id = sums.id
SET p."1" = sums.s1, p."2" = sums.s2, p."3" = sums.s3, p."4" = sums.s4, p."5" = sums.s5

这会将所有重复行修改为相同,每列都包含原始评级计数的总和。所以你要做的就是擦掉一堆副本,除了一个。在StackOverflow上已经多次询问过,例如:

我个人最喜欢的是:

ALTER IGNORE TABLE product ADD UNIQUE INDEX ("Product ID")

答案 2 :(得分:1)

我发现一个非常简单的方法是将所有数据导出到csv并在excel中打开并使用excel中的合并数据函数然后重新导入到MySQL中。不使用SQL来进行修正,但最终它更快更容易。

答案 3 :(得分:0)

我可以建议您创建视图而不是组合行吗?这样就可以获得原始数据,以备不时之需。