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

MySQL::カンマ区切りの文字列から選択

    スキーマを正規化する方が、リレーションをコンマ区切りのリストの形式で保存せず、代わりに m:mを維持するためのジャンクションテーブルを作成することをお勧めします。 ユーザーとフィルターの間の多対多の関係、user_filtersとして新しいテーブルを作成します 列フィルターIDとユーザーIDを使用し、各行でユーザーごとに1つの関連付けを保存し、多くのユーザーがいるフィルター1の現在のスキーマ関係のようにフィルターします(1, '1, 2, 3')

    のようになります
    filter id user id
        (1, '1'),
        (1, '2'),
        (1, '3'),
    

    サンプルスキーマは次のようになります

    CREATE TABLE user_filters
        (`fid` int, `u_id` varchar(50))
    ;
    
    INSERT INTO user_filters
        (`fid`, `u_id`)
    VALUES
        (1, '1'),
        (1, '2'),
        (1, '3'),
        (2, '5'),
        (2, '5')
    ;
    
    CREATE TABLE filters
        (`id` int, `title` varchar(50))
    ;
    
    INSERT INTO filters
        (`id`, `title`)
    VALUES
        (1, 'test'),
        (2, 'test 1')
    ;
    
    
    CREATE TABLE users
        (`id` int, `name` varchar(6))
    ;
    
    INSERT INTO users
        (`id`, `name`)
    VALUES
        (1, 'Tom'),
        (2, 'Tim'),
        (3, 'Sue'),
        (4, 'Bruce'),
        (5, 'Ann'),
        (6, 'George')
    ;
    

    上記のスキーマの場合、結合を使用して簡単にクエリを実行できます。以下のクエリは、インデックスを使用して最適化できます

    select u.* 
    from users u
    join user_filters uf on(uf.u_id = u.id)
     where uf.fid =1
    

    サンプルデモ

    スキーマを変更できず、現在のスキーマを維持したい場合は、以下のようにクエリできますが、上記のクエリと比較して、これを十分に最適化することはできません

    select u.* 
    from users u
    join filters f on(find_in_set(u.id,replace(`u_ids`,' ','')) > 0)
     where f.id =1 
    

    サンプルデモ

    データベースの正規化




    1. SQLServerのforループの構文

    2. @@ERRORおよび/またはTRY-CATCH

    3. SQL Server履歴テーブル-SPまたはトリガーを介してデータを入力しますか?

    4. スタースキーマ