2012-08-14 4 views
1

나는 이틀 동안 나의 질문에 대한 답을 연구 해왔다. 그리고 나는 내가 무엇을 찾고 있는지를 정확하게 기술하는 방법을 모르기 때문에 어떤 행운도 없었을 것이다. 내가 사용해야 할 방법으로결과의 숫자에 따른 MySQL concat

기본적으로 내 데이터베이스에는 tblCounties (ID, County_vc), 다른 tblOrganizations (ID, Organization_vc)라는 두 개의 테이블이 있습니다. 나는 jnCountyOrg (Org_fk_id, County_fk_id)라고 불리는 두개의 테이블을 연결한다. 한 조직은 최소한 한 카운티에 속할 수 있으며 최대 세 카운티까지 소속 될 수 있습니다. 내가 PHP를 사용하여 내 선택 쿼리를 통해 while 루프를 할 때, 에코는 다음과 같이 제대로 결과입니다 :

CountyName1CountyName2CountyName3 내가로 MYSQL_ASSOC와 mysql_fetch_assoc를 사용하여 시도

에게.

결과를 이렇게 형식화하고 싶습니다.

하나의 카운티 만 조직과 연결되어있는 경우 "xxx 카운티"입니다.

조직과 관련된 두 카운티가있는 경우 "xxx 및 xxx 카운티"를 표시합니다.

마지막으로 세 개의 카운티 (최대치)가 조직과 연결되어 있으면 "xxx, xxx 및 xxx 카운티"입니다.

CASE 문을 사용하여 SQL에서이 작업을 수행 할 것인지 또는 데이터베이스에서 쿼리 한 후 PHP를 사용하여 내 결과의 형식을 지정해야하는지 혼란 스럽습니다. 어떤 도움이라도 대단히 감사하겠습니다.

+4

PHP에서 더 나은 방법입니다. 그것은 표시 일입니다 - SQL은 일반적으로 그냥 원시 데이터에 사용해야합니다. –

+0

@MarcB와의 합의 - SQL에서는 가능하지만 총 PITA는 PHP에서하는 것보다 효율적이지 않을 수 있습니다. – DaveRandom

+0

[here] (http://sqlfiddle.com/#!2/bd62c/1)에서는 MySQL이 아닌 PHP에서이 작업을 수행해야하는 이유를 설명합니다. 그리고 그 엄청나게 복잡한 메커니즘조차도 카운티 이름에는'@ '가 포함될 수 없다고 가정합니다. 더 간단한 방법이있을 수 있지만 하나는 생각할 수 없다. MySQL의 문자열 조작 함수는 많이 필요하다. – DaveRandom

답변

1

여기는 SQLFiddle example입니다. county> 3의 경우에도 작동합니다.

select id,CompanyNAme,countyCount,countyNAmes, 
if(countyCount=1,concat(countyNAmes,' County'), 
    if(countyCount=2,concat(REPLACE(countyNAmes,', ',' and '),' Counties'), 

     CONCAT(SUBSTRING_INDEX(countyNAmes,',',countyCount-1) 
      ,' and ' 
      , SUBSTRING_INDEX(countyNAmes,',',-1) 
      ,' Counties' 
      ) 
    ) 
) RESULT 
from 
(
select o.id,max(o.Organization_vc) CompanyNAme, 
group_concat(c.County_vc separator ', ') CountyNames,count(c.id) CountyCount 

from tblOrganizations o 
left join jnCountyOrg co on (o.id=co.Org_fk_id) 
left join tblCounties c on (co.County_fk_id = c.id) 
group by o.id 
) m 
order by m.id 
+0

valexhome에 대해 알아내는 시간을내어 주셔서 감사합니다. 완벽하게 작동합니다! 다시 한 번 감사드립니다! –

+0

@Aust : 스택 오버플로에 오신 것을 환영합니다. 이 대답이 도움이 되었다면, [수락 된 것으로 표시하십시오] (http://stackoverflow.com/faq#howtoask) – valex