2012-08-14 3 views
1

J'ai fait des recherches sur la réponse à ma question depuis deux jours et je n'ai pas eu de chance, probablement parce que je ne sais pas exactement comment décrire ce que je cherche, pour autant comme les méthodes que je dois utiliser.Concurrence MySQL en fonction du nombre de résultats

Fondamentalement, dans ma base de données, j'ai deux tables, l'une nommée tblCounties (ID, County_vc), l'autre tblOrganizations (ID, Organization_vc). J'ai une troisième table qui relie les deux ensemble, appelé jnCountyOrg (Org_fk_id, County_fk_id). Une organisation peut appartenir à au moins un comté, jusqu'à un maximum de trois comtés. Quand je fais une boucle while dans ma requête de sélection en utilisant php, il est l'écho des résultats bien comme ceci:

CountyName1CountyName2CountyName3

J'ai essayé d'utiliser mysql_fetch_array et mysql_fetch_assoc.

Je voudrais que les résultats soient formatés comme ça.

SI un seul comté est associé à une organisation, echo "xxx County". Si deux comtés sont associés à l'organisation, alors les échos "xxx et xxx comtés" sont générés. Enfin, si trois comtés (qui est le maximum) sont associés à l'organisation, alors "Comités xxx, xxx et xxx". Je suis confus quant à savoir si je dois le faire dans le SQL en utilisant des instructions CASE, ou si je devrais utiliser php pour formater mes résultats de cette manière après qu'ils soient interrogés à partir de la base de données. Toute aide serait grandement appréciée.

+4

Mieux vaut le faire en PHP. c'est une chose d'affichage - sql devrait généralement juste être utilisé pour les données brutes. –

+0

Conclu avec @MarcB - c'est possible en SQL mais un PITA total et probablement moins efficace que de le faire en PHP. – DaveRandom

+0

Pour les coups de pied, [ici] (http://sqlfiddle.com/#!2/bd62c/1) est une démonstration de pourquoi vous devriez faire cela en PHP et pas MySQL. Et même ce mécanisme ridiculement complexe suppose toujours que les noms de comté ne peuvent pas contenir un @. Il peut y avoir un moyen plus simple mais je ne peux pas penser à un, les fonctions de manipulation de chaînes de MySQL laissent beaucoup à désirer ... – DaveRandom

Répondre

1

Voici un SQLFiddle example. Il fonctionne également pour le compte de comté> 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

merci de prendre le temps de comprendre cela pour moi valexhome. Fonctionne parfaitement! Merci encore! –

+0

@August: Bienvenue dans Stack Overflow. Si cette réponse a fonctionné pour vous, s'il vous plaît [marquer comme accepté] (http://stackoverflow.com/faq#howtoask) – valex

Questions connexes