序文
プロジェクトで 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_concat
ID 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;
もちろん、この計算は動的である必要があり、リファレンス実装を参照できます。