3 votes

Comment fusionner les lignes dupliquées dans ma base de données MySQL, les identifiants des produits et leurs évaluations ?

J'ai une base de données qui contient les identifiants des produits et la note sur 5 que les clients leur ont attribuée. Chaque ligne de la base de données représente une évaluation. Elle est assez simple et contient l'ID du produit et un 1 dans la colonne où l'avis était 1, 2, 3, 4 ou 5 étoiles. La base de données est structurée de la manière suivante :

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 |

Je veux fusionner les lignes où j'ai des identifiants de produits en double. Dans l'exemple ci-dessus, il y a deux lignes pour le produit ID 1196585. Dans ce cas, j'aimerais les combiner en une seule ligne avec un 2 sous la colonne 5 pour indiquer que ce produit a reçu deux commentaires de 5 étoiles.

Pour clarifier, je voudrais modifier le tableau de manière à ce que les lignes en double soient combinées, de sorte qu'il n'y ait plus d'ID de produit en double et que, dans chacune des colonnes 1, 2, 3, 4 et 5, je dispose du nombre de fois où chacun de ces ID de produit a reçu un avis de 1, 2, 3, 4 et 5 étoiles, par exemple.

Pourriez-vous m'aider à comprendre comment cela peut être réalisé avec SQL ?

1voto

Gordon Linoff Points 213350

Il s'agit d'une simple requête d'agrégation :

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

J'ai changé les noms ostensibles de vos colonnes en noms utilisant des caractères standards. 1 semble être un mauvais nom pour une colonne, par exemple.

1voto

Jerome Points 579

Pour modifier les données de votre tableau, vous pouvez utiliser l'instruction suivante :

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

Cela modifiera toutes les lignes dupliquées pour qu'elles soient identiques, chaque colonne représentant la somme des classements originaux. Il ne vous reste donc plus qu'à effacer un grand nombre de doublons, à l'exception d'un seul. Cette question a été posée à plusieurs reprises sur StackOverflow, par exemple :

Mon préféré est le suivant :

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

1voto

Ben Paton Points 513

J'ai trouvé un moyen très facile de le faire en exportant toutes les données au format csv, en les ouvrant dans Excel et en utilisant la fonction de consolidation des données dans Excel, puis en les réimportant dans MySQL. Je n'utilise pas SQL pour faire les corrections, mais c'était plus rapide et plus facile à la fin.

0voto

Robert Co Points 1440

Puis-je suggérer de créer un vue au lieu de combiner les lignes ? De cette façon, vous conservez vos données originales, au cas où vous en auriez besoin.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X