MySQL クエリ結果セットの文字列操作のための複数行のマージと単一行の分割

序文

プロジェクトで SQL ステートメントを作成するときに、クエリで取得した複数の列を 1 つの列に分割してマージして表示するか、クエリをカンマで区切られた複数の列に分割して、データベースの列、一般的なシナリオには記事のタグが含まれます。複数のタグをクエリしてそれらを 1 つの列にマージする必要があるなど、それを実現する方法。これには MySQL の操作が含まれます字符串

グループ連結

シーン再現 複数列のクエリデータを1列にまとめてカンマ区切りで表示したいのでgroup_concatこの機能を使用する

次の SQL ステートメント

select r.ROLE_NAME
from t_user u
         right join t_user_role ur on ur.USER_ID = u.USER_ID,
     t_role r
where r.ROLE_ID = ur.ROLE_ID
  and u.USER_ID = 7

group_concatID 7 のユーザーには 2 つの役割がありますが、列として表示したいので、次の SQL のように文字列関数を使用する必要があります。

select group_concat(r.ROLE_NAME)
from t_user u
         right join t_user_role ur on ur.USER_ID = u.USER_ID,
     t_role r
where r.ROLE_ID = ur.ROLE_ID
  and u.USER_ID = 7;

必要なものを達成しました

もちろん、group_concatこの関数はデフォルトでカンマを使用して接続します。また、次のように区切りのコンボを自分で指定することもできます。group_concat(name separator ';')

select group_concat(r.ROLE_NAME separator ';')
from t_user u
         right join t_user_role ur on ur.USER_ID = u.USER_ID,
     t_role r
where r.ROLE_ID = ur.ROLE_ID
  and u.USER_ID = 7;

もちろん、実際のアプリケーションはそれほど単純ではなく、サブクエリと組み合わせて使用​​する必要があります。

次の SQL は、 users などを含むユーザーの詳細をクエリし角色信息ます部门信息

select tu.*,
       d.DEPT_NAME,
       (select group_concat(r.ROLE_NAME)
        from t_user u
                 left join t_user_role ur on ur.USER_ID = u.USER_ID,
             t_role r
        where r.ROLE_ID = ur.ROLE_ID
          and u.USER_ID = tu.USER_ID) as roles
from t_user tu
         left join
     t_dept d
     on tu.DEPT_ID = d.DEPT_ID
where tu.USER_ID=7;

substring_index(str,delim,count)

このシナリオでは、一部のビジネス テーブルが歴史的理由またはパフォーマンス上の理由から違反した第一范式設計パターンを使用しているということです。つまり、複数の属性値が同じ列に格納されます。以下の表のテーマに示されているように、

この場合、区切り文字に従って列を分割することを検討できます。複数の列を形成するには、substring_index関数を使用する必要があります。

SUBSTRING_INDEX(str,delim,count)   
-- str: 被分割的字符串; delim: 分隔符; count: 分割符出现的次数

文字列「1,2,3」の場合、delim を「,」に設定し、count を 1 に設定すると「1」が返されます。他のパラメータは変更されず、count が 2 の場合は「1,2」が返されます。その他のパラメータ変更されていない場合、カウントが -1 の場合、「3」が返されます。

次のSQL

select USERNAME,
       (select substring_index(tu.THEME, ',', 1) from t_user tu where tu.USER_ID = 1) theme1,
       (select substring_index(tu.THEME, ',', 2) from t_user tu where tu.USER_ID = 1) theme2,
       (select substring_index(tu.THEME, ',', -1) from t_user tu where tu.USER_ID = 1) theme3
from t_user
where USER_ID = 1;

明らかにこれは私たちのニーズを満たしていませんが、次のようにネストされた SQL セルフクエリを実装できます。

select USERNAME,
       (select substring_index(tu.THEME, ',', 1) from t_user tu where tu.USER_ID = 1) theme1,
       (select substring_index((select substring_index(tu.THEME, ',', 2) from t_user tu where tu.USER_ID = 1),',',-1) theme2),
       (select substring_index(tu.THEME, ',', -1) from t_user tu where tu.USER_ID = 1) theme3
from t_user
where USER_ID = 1;

もちろん、この計算は動的である必要があり、リファレンス実装を参照できます。

おすすめ

転載: blog.csdn.net/u011738045/article/details/120334688