2009-02-12 10 views
3

Je n'ai traité que des relations un à un en php jusqu'à présent, mais je suis bloqué sur un problème qui implique une relation un-à-plusieurs. Cela fait quelques jours que je suis assis là-dessus sans aucune chance, alors j'ai désespérément besoin que quelqu'un intervienne et me montre une solution avant de perdre la tête.PHP et la sortie de résultats un-à-plusieurs

Dans ma base de données, vous disposez d'une série d'URL, qui sont reçues par une requête SELECT avec divers autres champs, à partir de tables différentes. Chaque URL a au moins une catégorie associée, mais peut avoir plusieurs catégories. Donc, dans mes résultats que je pourrais voir quelque chose qui ressemble un peu à ceci:

link_id = 3 url= 'http://www.somesite1.com' category = 'uncategorised' 
link_id = 4 url= 'http://www.somesite2.com' category = 'travel' 
link_id = 4 url= 'http://www.somesite2.com' category = 'fun' 
link_id = 4 url= 'http://www.somesite2.com' category = 'misc' 
link_id = 3 url= 'http://www.somesite3.com' category = 'uncategorised' 

J'ai que cela fonctionne, en quelque sorte. Lorsque je boucle et les imprime, en utilisant une boucle while et mysql fetch array, le résultat ressemble exactement à ce qu'il fait ci-dessus. Des thats très bien, sauf que j'ai besoin est pour lui lire quelque chose comme:

link_id = 4 url = 'http://www.somesite2.com' category = 'travel fun misc' 

Alors que, fondamentalement, toutes les catégories pour chaque URL sont combinées en quelque sorte, comme ils sont imprimés. Ma première tentative m'a conduit à essayer une boucle en boucle, mais cela n'a pas fonctionné et je ne suis pas sûr que ce soit faisable. En dehors de cela, je me demande si je pourrais avoir besoin d'un tableau multidimensionnel (devinez complètement, je n'ai jamais eu besoin d'en utiliser un auparavant).

Je commande ces résultats par ID de lien comme ci-dessus, donc je sais si l'ID de lien dans l'itération de boucle actuelle, correspond à celui de la dernière itération - alors j'ai quelque chose qui a plus d'une catégorie. pense que je suis vraiment proche, mais je ne peux pas le comprendre.

Des idées?

Répondre

3

Il y a aussi la fonction « GROUP_CONCAT » dans mysql. Cela devrait faire exactement ce que vous voulez accomplir.

Quelque chose comme:

SELECT url, GROUP_CONCAT(category) AS categories FROM yourtable GROUP BY url 
+0

Cela a fonctionné parfaitement quand j'ai couru la requête, et encore quand je l'ai branché dans mon script php. Je n'étais pas au courant de cette fonction, mais c'était exactement ce que je recherchais. Merci! – Jon

0

Vous devez utiliser une table de connexion.

1er vous avez une table de liens

id = 1 url = something 
id = 2 url = something else 

Ensuite, vous avez une table des catégories

id = 1 category = something 
id = 2 category = something else 

Ensuite, vous avez une table de connexion

url_id = 1 category_id = 1 
url_id = 1 category_id = 2 
url_id = 2 category_id = 1 

Vous devriez obtenir atleast commencé.

+0

ahh désolé, je l'ai fait un peu plus clair. Si je comprends bien, j'ai une configuration comme celle-ci. Une table appelée catégories, juste un référentiel de toutes les catégories qui existent, puis une table qui contient juste des urls, puis une table avec url_id et cat_id pour les joindre ensemble. – Jon

+0

Pas de problème :) Je vais garder la réponse jusqu'à ce que vous mettiez à jour la question si vous voulez faire cela. –

0

utiliser un tableau calée sur l'identifiant et l'URL itérer à travers les valeurs et ajouter comme suit:

$link_categories[ $id ] .= $category." "; 

$result = mysql_query("SElECT * FROM LINKS"); 

$link_categories = array(); 

while ($row = mysql_fetch_array($result,MYSQL_ASSOC)) 
{ 
    if (!isset($link_categories[$row['link']])) 
     $link_categories[$row['link']] = " "; 
    else 
     $link_categories[$row['link']] .= " "; 

    $link_categories[$row['link']] .= $row['category']; 
} 

print_r($link_categories); 

Résultats dans:

Array 
(
    [http://a.com] => test evaluate performance 
    [http://b.com] => classify reduce 
    [http://c.com] => allocate 
) 

Ce n'est pas la voie « droit » de faire ceci - vraiment les relations devraient être définies dans une table séparée de avec une relation un-plusieurs.

0

vous devez utiliser un algorithme de rupture de contrôle.

set last_link variable to null 
set combined_category to null 
exec query 

loop over result set { 
    if last_link == null { 
     last_link=fetch_link 
    } 
    if fetch_link==last_link { 
     set combined_category+=ltrim(' '.fetch_category) 
    } else { 
     display html for last_link and combined_category 
     set last_link=fetch_link 
     set combined_category=fetch_category 
    } 
}//loop 

display html for last_link and combined_category 

je événement « affichage html » comme générique « travail », vous pouvez pousser ceci à une structure de réseau, etc. ... à la place

Questions connexes