2010-03-23 8 views
7

J'ai trois tables, Catégorie Films et RelCatMovComment afficher le résultat des lignes de sous-requête en une seule colonne dans MySQL?

Catégorie table

categoryid, categoryName 
1   thriller 
2   supsense 
3   romantic 
4   action 
5   sci-fi 

Films table

movieid, movieName 
1   Avataar 
2   Titanic 
3   NinjaAssassin 

RelCatMov table

categoryid, MovieID 
1   1 
2   2 
3   2 
4   2 
5   2 

Maintenant, je veux afficher un dossier comme

MovieName  Categories 
Titanic Suspense,Romantic,Sci-fi,action 

Comment faire.

Je vous écris une requête

select MovieName,(select categoryname from category b,relcatmov c where b.categoryid=c.categoryid and c.movieid=a.movieid) as categories from movies a; 

Error: Subquery returns more than one row!!! 

Comment afficher le résultat de lignes dans une colonne?

S'il vous plaît aider !!!

+0

Pourquoi l'exigence spécifique (plutôt étrange) d'obtenir des valeurs séparées par des virgules? Ce n'est pas une bonne façon de représenter un mappage un à plusieurs dans le SGBDR. –

+0

peut-être pour la même raison que j'en avais besoin. Pour créer optimisé dans la mémoire rep pour des recherches simples. Beaucoup plus rapide et plus facile à faire une recherche de texte de virgule séparée que d'utiliser une autre connexion ou thread sur la base de données. –

Répondre

10

Dans Oracle, cela s'appelle stragg. En MySQL c'est GROUP_CONCAT.

select MovieName,(select GROUP_CONCAT(categoryname) from category b,relcatmov c where b.categoryid=c.categoryid and c.movieid=a.movieid) as categories from movies a; 

Pour référence, votre problème est que MySQL veut retourner une valeur unique et vous retournez plusieurs lignes au lieu.

+0

Merci d'avoir mentionné "stragg" dans votre réponse ... cette question est apparue d'abord dans une recherche Google pour "mysql stragg". – Paul

-2

Pour un besoin similaire en MS-SQL, j'ai écrit une fonction qui me renvoie une liste concaténée (chaîne). Vous pouvez donc suivre cette approche.