Combinación de varias filas y división de una sola fila para la operación de cadenas del conjunto de resultados de consultas de MySQL

prefacio

Cuando escribimos sentencias SQL en un proyecto, nos encontraremos con tal escenario, es decir, necesitamos dividir y fusionar varias columnas de la consulta en una columna para mostrar de acuerdo con la cadena, o dividir la consulta en varias columnas separadas por comas. en las columnas de la base de datos, los escenarios comunes incluyen etiquetas de artículos, debe consultar varias etiquetas y fusionarlas en una columna, etc., cómo lograrlo, lo que implica la operación de 字符串MySQL

grupo_concat

Reproducción de escenas Quiero combinar varias columnas de datos de consulta en una columna y mostrarlas separadas por comas, por lo que necesito usar group_concatesta función

La siguiente sentencia 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

El usuario con ID 7 tiene dos roles, pero ahora quiero mostrarlo como una columna, necesito usar la función de cadena group_concatde la siguiente manera 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;

Logré lo que necesitaba

Por supuesto, group_concatla función usa comas por defecto para conectarse, y también podemos especificar el combo delimitador por nosotros mismos, comogroup_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;

Por supuesto, la aplicación real no solo es tan simple, sino que debe usarse en combinación con subconsultas.

El siguiente sql consulta los detalles del usuario, incluidos los usuarios 角色信息, 部门信息etc.

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)

El escenario es que algunas tablas de negocios usan un 第一范式patrón de diseño violado por razones históricas o de rendimiento. Es decir, se almacenan múltiples valores de atributos en la misma columna. Como se muestra en el tema de la siguiente tabla:

En este caso, puede considerar dividir la columna de acuerdo con el delimitador. Para formar varias columnas, debe usar substring_indexla función

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

Para la cadena "1,2,3", establezca delim en "," y contar hasta 1, devolverá "1"; otros parámetros permanecen sin cambios, si el recuento es 2, devolverá "1,2"; otros parámetros no son Cambio, el recuento es -1, devolverá "3".

el siguiente 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;

Obviamente no satisface nuestras necesidades, podemos implementar la autoconsulta sql anidada de la siguiente manera

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;

Por supuesto, este cálculo debe ser dinámico, puede consultar la implementación de referencia

Supongo que te gusta

Origin blog.csdn.net/u011738045/article/details/120334688
Recomendado
Clasificación