MySQL 쿼리 결과 집합의 문자열 연산을 위한 다중 행 병합 및 단일 행 분할

머리말

프로젝트에서 SQL 문을 작성할 때 이러한 시나리오가 발생합니까? 즉, 문자열에 따라 표시하기 위해 쿼리의 여러 열을 하나의 열로 나누고 병합하거나 쿼리를 쉼표로 구분된 여러 열로 나누어야 합니다. 데이터베이스 열에서 일반적인 시나리오에는 문서 태그가 포함되며, 여러 태그를 쿼리하고 하나의 열로 병합해야 하는 등의 방법이 있으며, 여기에는 字符串MySQL 작업이 포함됩니다.

group_concat

장면 재생 쿼리 데이터의 여러 열을 하나의 열로 결합하여 쉼표로 구분하여 표시하고 싶기 때문에 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

ID가 7인 사용자는 두 가지 역할을 가지고 있는데 이제 열로 표시하고 싶고 group_concat다음과 같이 문자열 함수를 사용해야 합니다.

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은 사용자 등을 포함한 사용자 세부 정보를 쿼리 角色信息합니다 部门信息.

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을 ","로 설정하고 카운트를 1로 설정하면 "1"을 반환합니다. 다른 매개변수는 변경되지 않고 그대로 유지하며 카운트가 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