sql >> Databáze >  >> RDS >> Mysql

SQL sloučit duplicitní řádky a spojit hodnoty, které se liší

Špatný postup při používání seznamů oddělených čárkami. Můžete si přečíst dokumentaci o normalizaci databáze.

Seznamy oddělené čárkami mají mnoho praktických problémů :

  • Nelze zajistit, aby každá hodnota měla správný datový typ:nelze zabránit 1,2,3,banana,5
  • Nelze použít omezení cizího klíče k propojení hodnot s vyhledávací tabulkou, žádný způsob, jak vynutit referenční integritu.
  • Nelze vynutit jedinečnost:žádný způsob, jak zabránit 1,2,3,3,3,5
  • Nelze smazat hodnotu ze seznamu bez načtení celého seznamu.
  • Nelze uložit seznam delší, než kolik se vejde do sloupce řetězce.
  • Těžko se hledají všechny entity s danou hodnotou v seznamu; musíte použít neefektivní skenování tabulky. Možná se budete muset uchýlit k regulárním výrazům, například v MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Je obtížné spočítat prvky v seznamu nebo provádět jiné souhrnné dotazy.
  • Těžko připojit hodnoty k vyhledávací tabulce, na kterou odkazují.
  • Obtížné načíst seznam v seřazeném pořadí.
  • Ukládání celých čísel jako řetězců zabere přibližně dvakrát tolik místa než ukládání binárních celých čísel. Nemluvě o prostoru, který zabírají čárky.

Ale pokud to v každém případě potřebujete, můžete použít něco takového:

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

Další informace o Seznamy oddělené čárkami




  1. SQL Query - zřetězení výsledků do jednoho řetězce

  2. Osvědčený vícejazyčný web

  3. SQL DML:Nesprávná hodnota data (MySQL)

  4. Reference:Jaký je dokonalý příklad kódu pomocí rozšíření MySQL?