2015-01-29 1 views
0

여기 약간 혼란 스럽습니다.삽입 및 한도와 함께 사용할 경우 MySql group_concat 동작

나는 table_a와 table_b를 가지고 있으며 아래의 SQL을 실행합니다.

table_a 

"id" "addedUser" "addedName" 
"1"  "1"   "james" 
"2"  "1"   "kirk" 
"3"  "1"   "lars" 
"4"  "2"   "michael" 

table_b 

"id" "userName" "userDisplay" "userFreinds" 
"1"  "norman" "james"   "james,kirk,lars" 

insert into table_b (
userName, 
userDisplay, 
userFreinds 
) select 'norman', addedName, group_concat(addedName) from table_a where addedUser = 1 limit 1; 

내 생각은, 특정 사용자에 대한 table_a의 모든 addedName 값의 쉼표로 구분 된 값의 목록과 함께, table_btable_a에서 addedName에서 최상위 기록을 얻을 수 있습니다.

문에서 한도를 사용하지만 mysql은 내가 지정한 사용자의 userFriends에 대한 모든 addedName 값의 문자열을 제공하는 것처럼 보입니다.

하지만이 방법이 올바른/최적의 방법입니까? MySql은 userDisplay에 대한 단일 값을 어떻게 반환합니까? 그러나 모든 값은 userFriends입니까? group_concat 거기에서 별도의 선택을 실행하고 있습니까? 이런 식으로 유지하면 성능 문제가 발생합니까?

이상하게도 결과는 LIMIT가 없어도 동일합니다. 나는 거기에 한계를 지켜야 하는가?

더 좋은 방법이 있나요? 결과는 내가 필요한 것입니다. 나는 여기서 옳고 그름을 어떻게하고 있나?

+0

선택 사항에 대해 EXPLAIN을 실행하여 현재 진행중인 작업을 확인해야합니다. 이 쿼리를 실행하십시오 : explainUnumer = 1 limit 1 –

답변

1

이것은 addedUser = 1 (당신의 table_a에서 3 행)이있는 곳 어디,

select 'norman', addedName, group_concat(addedName) from table_a where addedUser=1 limit 1 

먼저 모든 행을 실행할 때 발생하는 것입니다.

그런 다음 집계 함수 (group_concat)를 사용하고 있지만 GROUP BY 절이 없으므로 3 개의 행은 모두 하나의 단일 그룹으로 간주됩니다.

마지막으로 값이 james,kirk,lars 등인 그룹화 된 행이 하나 있습니다. LIMIT 1을 지정할 필요가 없으므로 결과로 한 행만 항상 표시됩니다.

MySQL에서는 COUNT() 또는 GROUP_CONCAT()과 같은 집계 함수를 집계되지 않은 열 (예 : 쿼리의 addedName)과 결합 할 수 있으므로 제한없이 또는 사용하지 않고 완벽하게 사용할 수 있습니다.

+0

그래서 table_a에서 group_concat (addedName)을 선택하고 'norman'을 선택하십시오. 다음과 같은 명령문을 사용하여 성능 문제 또는 속도 저하가 발생하지 않도록하십시오 ... – Norman