sql >> データベース >  >> RDS >> Mysql

SQLは重複する行をマージし、異なる値を結合します

    カンマ区切りのリストを使用するのは悪い習慣です。 ドキュメント を読むことができます データベースの正規化について。

    カンマ区切りのリストには多くの実用的な問題があります

    • 各値が正しいデータ型であることを確認できません。1,2,3、banana、5を防ぐ方法はありません
    • 外部キー制約を使用して値をルックアップテーブルにリンクすることはできません。参照整合性を強制する方法はありません。
    • 一意性を強制することはできません:1,2,3,3,3,5を防ぐ方法はありません
    • リスト全体を取得せずにリストから値を削除することはできません。
    • 文字列列に収まる長さより長くリストを保存することはできません。
    • リスト内の特定の値を持つすべてのエンティティを検索するのは困難です。非効率的なテーブルスキャンを使用する必要があります。たとえば、MySQLでは正規表現を使用する必要がある場合があります。idlist REGEXP '[[:<:]]2[[:>:]]'
    • リスト内の要素を数えたり、その他の集計クエリを実行したりするのは困難です。
    • 値を参照するルックアップテーブルに結合するのは困難です。
    • ソートされた順序でリストを取得するのは難しい。
    • 整数を文字列として格納するには、2進整数を格納するスペースの約2倍のスペースが必要です。カンマ文字が占めるスペースは言うまでもありません。

    ただし、いずれにせよ必要な場合は、次のようなものを使用できます。

    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
    

    カンマ区切りのリスト




    1. 結果をSQLでグループ化せずにSUM操作を適用するにはどうすればよいですか?

    2. 値がデータベースに存在するかどうかをチェックするJava

    3. SQL:DISTINCTで行の順序を維持するにはどうすればよいですか?

    4. PHP/MySQLでランクを計算する