2010-11-20 3 views
2

Je suis en train de coder un script d'archive de film en utilisant codeigniter pour moi-même avec PHP. Je reçois des informations sur le film d'IMDb et je les ajoute à ma base de données. J'ajoute des liens pour les films que j'ai sélectionnés en utilisant une autre table appelée liens.Joindre des rangées en tant que tableau d'une autre table pour chaque ligne

C'est la requête que j'utilise pour obtenir les films de base de données:

$movies = $this->db->query("SELECT * 
    FROM movies 
    ORDER BY ".$order['by']." ".$order['type']." 
    LIMIT ".$limit.", " . $this->config->item('moviePerPage') 
); 

et je suis aller chercher dans le fichier de vue comme celui-ci:

foreach ($movies->result() as $row) { 
    echo $row->name; 
} 

maintenant des liens doivent être affichés pour chaque film avec les ID correspondants (les films pourraient avoir plus d'un lien). Ma table de liens a ces colonnes: 'id', 'movieid', 'nom', 'lien'

Comment puis-je obtenir des liens pour chaque film avec une seule requête MySQL? Est-il possible d'obtenir tous les liens liés au film $ row courant et de les lier à une seule variable en tant que tableau? avec ceci je peux le boucler avec foreach() et montrer des liens pour chaque film. Btw: movies.movieid et links.movieid colonnes ont les mêmes données. REJOIGNEZ les deux tables, comme le nom de votre question l'indique.

Répondre

3

Je pense que vous avez besoin mysql GROUP_CONCAT

FAISONS quelque chose comme ceci: -

SELECT 
    movies.*, 
    group_concat(links.link ', ') as links 
FROM movies 
LEFT JOIN links 
ON links.movieid = movies.movieid 
GROUP BY movies.movieid 

Vous obtiendrez une liste séparée par des virgules des liens pour chaque film. Que vous pouvez extraire comme ceci: -

foreach ($movies->result() as $row) { 
    $linksArray = explode(",",$row->links); 
} 

Mises à jour Je pense que c'est la seule façon que vous pouvez obtenir les résultats sans avoir des lignes de résultats multiples pour un seul film avec de multiples liens. Faites juste attention à la longueur maximum de caractères que vous pouvez obtenir dans le résultat - par défaut 1024 caractères. Lire ce Mysql group_concat_max_length et Group concat max length pour savoir comment remplacer la limite. Comme Dan Grossman l'a signalé, si vous pensez que les liens peuvent contenir une virgule, utilisez un délimiteur différent ou inhabituel.

+0

Les liens peuvent avoir des virgules. Ce que vous faites n'appartient pas à SQL.La création de structures de données et la logique d'affichage appartiennent à l'application. –

+0

@Dan Grossman - si les virgules sont un problème, un autre délimiteur inhabituel peut être utilisé comme '%% @@ && @@ %%' Comment cela n'appartient-il pas à SQL? group_concat est une clause mysql et est utilisée comme ceci. Je ne suis pas ici pour imposer ma réponse mais ce qui ne va pas. Les utilisateurs doivent seulement faire attention aux pièges et c'est tout. –

+0

J'ai dû utiliser 'SEPARATOR' avant le' ',' 'pour exécuter la requête avec succès. [Voir doc] (http://dev.mysql.com/doc/refman/5.0/fr/group-by-functions.html#function_group-concat). –

0

SELECT 
    movies.*, 
    links.* 
FROM movies 
LEFT OUTER JOIN links 
ON links.movieid = movies.movieid 
... 

Vous obtiendrez une ligne par paire de liaison vidéo. S'il n'y a pas de liens pour un film, vous obtiendrez une ligne contenant uniquement les informations sur le film et les valeurs NULL dans les colonnes correspondant à la table des liens.

Vous pouvez parcourir ces résultats et placer les liens de chaque film dans un tableau saisi par le film, si vous le souhaitez.

+0

J'ai essayé mais j'ai eu un problème. S'il y a 2 liens liés à ce film, il crée deux mêmes groupes de films. pourrait être comme ceci ?: $ movie ['nom'], $ movie ['movieid'], $ movie ['liens'] [0,1 ...] ['name'] – Valour

+0

@Spelljack, vérifie ma réponse . De cette façon, vous obtiendrez un résultat unique pour chaque film, même si un film a plusieurs liens –

+0

Ce n'est pas un problème. C'est ainsi qu'une base de données relationnelle fonctionne. Vous devez écrire le code pour le transformer en tableau que vous voulez. –

Questions connexes