2012-08-14 67 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