3

我有一个数据库,其中包含产品 ID 和 5 位客户给出的评分。数据库中的每一行代表 1 条评论。它非常简单,并且在评论为 1、2、3、4 或 5 星的列中有产品 ID 和 1。它是这样布置的:

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 个已收到 1、2、3、4 和 5 星评价。

请您帮我理解如何使用 SQL 来实现这一点?

4

4 回答 4

1

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

于 2013-05-22T23:39:21.397 回答
1

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

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例如,对于一列来说,这似乎是一个坏名字。

于 2013-05-22T20:17:12.250 回答
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")
于 2013-05-22T22:48:03.620 回答
0

我可以建议创建一个视图而不是组合行吗?这样你就有了原始数据,以备不时之需。

于 2013-05-22T23:15:44.893 回答