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_concat
esta 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_concat
de 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_concat
la 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_index
la 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