Mysql
 sql >> Datenbank >  >> RDS >> Mysql

SQL führt doppelte Zeilen zusammen und verbindet unterschiedliche Werte

Schlechte Praxis, kommagetrennte Listen zu verwenden. Sie können die Dokumentation lesen über Datenbanknormalisierung.

Komma-getrennte Listen haben viele praktische Probleme :

  • Kann nicht sicherstellen, dass jeder Wert der richtige Datentyp ist:keine Möglichkeit, 1,2,3,Banane,5 zu verhindern
  • Fremdschlüsselbeschränkungen können nicht verwendet werden, um Werte mit einer Nachschlagetabelle zu verknüpfen; keine Möglichkeit, die referenzielle Integrität zu erzwingen.
  • Eindeutigkeit kann nicht erzwungen werden:1,2,3,3,3,5 kann nicht verhindert werden
  • Es kann kein Wert aus der Liste gelöscht werden, ohne die gesamte Liste abzurufen.
  • Eine Liste kann nicht länger gespeichert werden, als in die String-Spalte passt.
  • Es ist schwierig, nach allen Entitäten mit einem bestimmten Wert in der Liste zu suchen; Sie müssen einen ineffizienten Table-Scan verwenden. Möglicherweise muss auf reguläre Ausdrücke zurückgegriffen werden, zum Beispiel in MySQL:idlist REGEXP '[[:<:]]2[[:>:]]'
  • Es ist schwierig, Elemente in der Liste zu zählen oder andere aggregierte Abfragen durchzuführen.
  • Es ist schwierig, die Werte mit der Verweistabelle zu verknüpfen, auf die sie verweisen.
  • Schwierig, die Liste in sortierter Reihenfolge abzurufen.
  • Das Speichern von Integern als Strings benötigt etwa doppelt so viel Platz wie das Speichern von binären Integern. Ganz zu schweigen von dem Leerzeichen, das die Kommazeichen einnehmen.

Aber wenn Sie es für jeden Fall brauchen, könnten Sie so etwas verwenden:

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

Mehr über Komma-separierte Listen