2012-08-14 87 views
1

我一直在研究我的問題的答案,現在兩天了,我沒有任何運氣,可能是因爲我不知道如何描述我在找什麼,到目前爲止作爲我需要使用的方法。我有兩個表,一個名爲tblCounties(ID,County_vc),另一個tblOrganizations(ID,Organization_vc)。我有第三個表格將兩者聯繫在一起,稱爲jnCountyOrg(Org_fk_id,County_fk_id)。一個組織可以屬於最少一個縣,最多三個縣。當我使用PHP做一個while循環通過我的選擇查詢,它Echo的結果正確是這樣的:MySQL concat根據結果數

CountyName1CountyName2CountyName3

我一直在使用mysql_fetch_array和mysql_fetch_assoc嘗試。

我想將結果格式化如此。

如果只有一個縣與一個組織相關聯,則回顯「xxx縣」。

如果兩個縣與組織相關聯,則回顯「xxx和xxx縣」。最後,如果三個縣(即最大值)與該組織相關聯,那麼「xxx,xxx和xxx縣」就是該組織的關聯組織。

我很困惑我是否要在使用CASE語句的SQL中執行此操作,或者是否應該使用php在從數據庫中查詢後以這種方式格式化結果。任何幫助將不勝感激。

+4

更好的做到這一點在PHP中。這是一個顯示的東西 - sql通常應該只用於原始數據。 – 2012-08-14 11:45:29

+0

與@MarcB達成一致 - 這在SQL中是可行的,但總體PITA可能比在PHP中執行時低。 – DaveRandom 2012-08-14 11:46:21

+0

對於踢腿,[here](http://sqlfiddle.com/#!2/bd62c/1)是爲什麼你應該在PHP而不是MySQL中做這個演示。即使這種可笑的複雜機制仍然假定縣名不能包含「@」。可能有一個更簡單的方法,但我想不出一個,MySQL的字符串操作函數留下了很多想要的... – DaveRandom 2012-08-14 13:11:39

回答

1

這是SQLFiddle example。它也適用於縣計數> 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。完美的作品!再次感謝! – 2012-08-14 14:04:06

+0

@八月:歡迎來到Stack Overflow。如果這個答案適合你,請[標記爲已接受](http://stackoverflow.com/faq#howtoask) – valex 2012-08-14 14:10:23