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

Mysql Split String and Select with results

    正規化について考える必要があります。ただし、現在のスキーマについては、次のことを考慮してください

    mysql> select * from frontend_users ;
    +------+-----------+---------+
    | uid  | usergroup | name    |
    +------+-----------+---------+
    |    1 | 1,2,3     | Michael |
    |    2 | 2         | Tobias  |
    |    3 | 1         | Colin   |
    +------+-----------+---------+
    3 rows in set (0.00 sec)
    
    mysql> select * from usergroup ;
    +------+----------+
    | uid  | title    |
    +------+----------+
    |    1 | member   |
    |    2 | reporter |
    |    3 | admin    |
    +------+----------+
    3 rows in set (0.00 sec)
    

    目的の結果を得るには、次のクエリを使用できますが、これは長期的には効率的ではありません

    select 
    u.uid,
    u.name, 
    group_concat(g.title) as groups 
    from frontend_users u 
    join usergroup g on find_in_set(g.uid,u.usergroup) > 0 
    group by u.uid ;
    
    +------+---------+-----------------------+
    | uid  | name    | groups                |
    +------+---------+-----------------------+
    |    1 | Michael | admin,reporter,member |
    |    2 | Tobias  | reporter              |
    |    3 | Colin   | member                |
    +------+---------+-----------------------+
    

    ここで、より良いアプローチは、関連付けテーブルを次のように作成することです

    mysql> create table user_to_group (uid int, gid int);
    Query OK, 0 rows affected (0.15 sec)
    
    mysql> insert into user_to_group values (1,1),(1,2),(1,3),(2,2),(3,1);
    Query OK, 5 rows affected (0.02 sec)
    Records: 5  Duplicates: 0  Warnings: 0
    

    そして、より良いクエリは

    select 
    u.uid,
    u.name, 
    group_concat(g.title) as groups 
    from frontend_users u 
    join user_to_group ug on ug.uid = u.uid 
    join usergroup g on g.uid = ug.gid 
    group by u.uid ;
    
    +------+---------+-----------------------+
    | uid  | name    | groups                |
    +------+---------+-----------------------+
    |    1 | Michael | member,admin,reporter |
    |    2 | Tobias  | reporter              |
    |    3 | Colin   | member                |
    +------+---------+-----------------------+
    


    1. MySQLで親子モデルの深さを計算する

    2. Java for OS X 2013-004はSwingアプリケーションにどのように影響しますか?

    3. リレーショナルデータベースと非リレーショナルデータベース–パート3

    4. 古いmysqlデータフォルダをインポートする