MySQL 필드는 substring_index로의 열 변환을 구현하기 위해 쉼표로 구분된 후 그룹별 통계가 수행됩니다.

MySQL은 각 계약 유형(다중 선택 필드)의 발생 횟수를 계산합니다.

질문:

계약 유형을 다중 선택하여 데이터베이스에 쉼표로 구분된 형식으로 저장하는 계약 테이블이 있는데 이제 각 계약 유형의 발생 횟수를 계산하려고 합니다.

계약 테이블 데이터:
여기에 이미지 설명을 삽입하세요.

성취하다

1단계: 계약 유형을 쉼표로 여러 데이터 조각으로 구분합니다.

예상 결과:
여기에 이미지 설명을 삽입하세요.
SQL 구현:

	select
		a.id,
		a.cont_type,
		b.help_topic_id + 1,
		substring_index(substring_index(a.cont_type, ',', b.help_topic_id + 1), ',',-1) type_new
	from opt_cont a
	left join mysql.help_topic b on b.help_topic_id < (length(a.cont_type) - length(replace(a.cont_type, ',', ''))+ 1)

2단계: 새로 분할된 계약 유형을 그룹화하고 수량을 계산합니다.

예상 결과:
여기에 이미지 설명을 삽입하세요.
SQL 구현:

select
	t.type_new dictValue,
	count(t.id) dictValueCount
from
	(
	select
		a.id,
		a.cont_type,
		b.help_topic_id + 1,
		substring_index(substring_index(a.cont_type, ',', b.help_topic_id + 1), ',',-1) type_new
	from opt_cont a
	left join mysql.help_topic b on b.help_topic_id < (length(a.cont_type) - length(replace(a.cont_type, ',', ''))+ 1)
	) t
group by t.type_new 

사용된 기능:

1、SUBSTRING_INDEX(str,delim,count):

str: 처리할 문자열
delim: 구분자
count: count
양수: from 계산 from 왼쪽에서 오른쪽으로, N 번째 구분 기호 왼쪽에 있는 모든 내용,
음수인 경우 오른쪽부터 계산, N 번째 구분 기호 오른쪽에 있는 모든 내용

2. help_topic 테이블은 mysql과 함께 제공되는 연속 시퀀스 테이블입니다.

mysql.help_topic 테이블의 경우 help_topic_id만 사용합니다.
이 help_topic_id는 0부터 시작하여 계속 이어지는 것을 볼 수 있습니다.
Join 이 테이블은 단지 데이터 행의 수를 결정하기 위한 것입니다.
이제 내 mysql.help_topic에 총 5개의 데이터만 있다고 가정하면 최대 5행의 데이터로 변환할 수 있습니다. 필드 이름이 6개라면 mysql.help_topic 테이블은 쓸 수 없다. .

3、substring_index(substring_index(a.execute_name,',',b.help_topic_id+1),',',-1)

select 
a.id,
b.help_topic_id +1,
a.execute_name,
#从左往右循环取 b.help_topic_id+1 个字符
substring_index(a.execute_name,',',b.help_topic_id+1), 
#从右往左第一个,右边的数据
substring_index(substring_index(a.execute_name,',',b.help_topic_id+1),',',-1) 
from `user` a
left join mysql.help_topic b
on b.help_topic_id < (length(a.execute_name) - length(replace(a.execute_name,',',''))+1)
order by a.id, b.help_topic_id

4、条件后면의 b.help_topic_id < (길이(a.execute_name) - 길이(replace(a.execute_name,',',''))+1)

쉼표로 구분된 전체 필드 수를 가져옵니다. (원래 필드 길이와 쉼표 없는 필드 길이를 계산합니다. 둘의 차이는 쉼표 수입니다. 쉼표 3개는 필드 4개를 의미합니다...)

5. 조인 이 조인의 가장 기본적인 원리는 데카르트 곱입니다. 이런 식으로 사이클이 구현됩니다.

이 방법의 단점은 연속적인 열이 있는 별도의 테이블(여기서는 incre_table)이 필요하다는 것입니다. 그리고 연속 시퀀스의 최대값은 나누기를 충족하는 값의 개수보다 커야 합니다.
예를 들어 행의 mSize에 쉼표로 구분된 값이 100개 있는 경우 incre_table에는 최소 100개의 연속 행이 있어야 합니다.
mysql에는 미리 만들어진 연속 숫자 목록도 있습니다. mysql.help_topic 등: 일반적으로 대부분의 요구 사항을 충족할 수 있습니다.

추천

출처blog.csdn.net/qq_42547733/article/details/134117136