Mysql
 sql >> Base de données >  >> RDS >> Mysql

SQL fusionne les lignes en double et joint les valeurs qui sont différentes

Mauvaise pratique d'utiliser des listes séparées par des virgules. Vous pouvez lire la documentation sur la normalisation de la base de données.

Les listes séparées par des virgules posent de nombreux problèmes pratiques :

  • Impossible de garantir que chaque valeur correspond au bon type de données :aucun moyen d'empêcher 1,2,3,banane,5
  • Impossible d'utiliser des contraintes de clé étrangère pour lier des valeurs à une table de recherche ; aucun moyen d'appliquer l'intégrité référentielle.
  • Impossible d'imposer l'unicité :aucun moyen d'empêcher 1,2,3,3,3,5
  • Impossible de supprimer une valeur de la liste sans récupérer toute la liste.
  • Impossible de stocker une liste plus longue que ce qui tient dans la colonne de chaîne.
  • Difficile de rechercher toutes les entités avec une valeur donnée dans la liste ; vous devez utiliser un balayage de table inefficace. Peut avoir recours à des expressions régulières, par exemple dans MySQL :idlist REGEXP '[[:<:]]2[[:>:]]'
  • Difficile de compter les éléments dans la liste ou d'effectuer d'autres requêtes agrégées.
  • Difficile de joindre les valeurs à la table de recherche à laquelle elles font référence.
  • Difficile de récupérer la liste dans l'ordre trié.
  • Le stockage d'entiers sous forme de chaînes prend environ deux fois plus d'espace que le stockage d'entiers binaires. Sans parler de l'espace pris par les virgules.

Mais si vous en avez besoin dans tous les cas, vous pouvez utiliser quelque chose comme ça :

SELECT  FilmID,
        FilmName, 
        Id = REPLACE(
                (
                SELECT DateShown AS [data()]
                FROM YourTable
                WHERE FilmID = a.FilmID
                ORDER BY FilmName FOR XML PATH('')), ' ', ','
                )
FROM    YourTable a
WHERE   FilmName IS NOT NULL
GROUP BY FilmID, FilmName

En savoir plus sur Listes séparées par des virgules