2009-03-30 10 views
2

Comment puis-je récupérer cette requête en utilisant mysql?Valeurs séparées par des virgules

Tableau 1:

id : nos 

1 12,13,14 
2 14 
3 14,12 

Tableau 2:

id : values 

12 PHP 
13 JAVA 
14 C++ 

Maintenant, je veux sortie comme ceci:

1 PHP, JAVA, C++ 
2 C++ 
3 C++, PHP 
+0

Très difficile à lire, mais voulez-vous vraiment dire que dans le tableau 1 il y a trois lignes. Dans le premier a la valeur de varchar "12, 13, 14"? –

Répondre

9

Non t testé mais il devrait être quelque chose comme ceci:

SELECT table1.id, GROUP_CONCAT(table2.values) 
FROM table1 INNER JOIN table2 ON FIND_IN_SET(table2.id, table1.nos) 
GROUP BY table1.id 
+0

Salut soulmerge ,, wow ça fonctionne bien maintenant .. merci pour votre réponse rapide –

+0

Heureux que ça fonctionne :) – soulmerge

+0

Je dois dire, je suis impressionné, si je pouvais +2 ou même +100 je le ferais. –

3

Il n'y a aucun moyen que je connaisse pour y parvenir en SQL. Vous devriez plutôt avoir une relation de 1 à N pour représenter ces listes. Quelque chose comme:

Tableau 1: (juste ids)

Tableau 1.1: (carte ids aux valeurs dans leur liste)

  • 1, 12
  • 1, 13
  • 1, 14
  • 2, 14
  • 3, 14
  • 3, 12
+0

Existe-t-il un autre moyen sans changer la table? puis-je utiliser la procédure stockée pour cela? –

+0

Allez, juste parce que vous ne savez pas comment le faire dans Sql ne veut pas dire a) ça ne peut pas être fait et b) vous devriez suggérer quelque chose avec des tables mal conçues. –

+0

@PintSizedCat: Je n'ai pas dit que ça ne pouvait pas être fait, et c'est pourquoi j'ai dit "que je connais". Et de toute façon, c'est une approche très courante pour relier les lignes d'une table à plusieurs lignes dans une autre table. J'ai trouvé la solution FIND_IN_SET intéressante, et je crois que cela convient mieux à ce problème. –

0

CONCERNES Ce commentaire comme, mais il devient longue.

SoulMerge La réponse (+1) est spécifique à MySql, à laquelle la question était initialement destinée. Veuillez consulter les modifications pour la question initiale.

La question a de nouveau été modifiée pour le système MY-SQL, mais de toute façon.

Alors que vous pouvez réaliser cela en MS SQL by using PATINDEX, je ne suis pas sûr que vous pouvez le faire dans Oracle.

Je pense qu'il serait préférable de restructurer les tables comme suggéré par jo227o-da-silva (+1).

0

Bien que n'étant pas complètement pertinent pour le sujet (MySQL), mais aidant les autres à trouver la question par titre, dans le serveur MSSQL cela peut être obtenu en utilisant l'astuce FOR XML et quelques remplacements de chaînes.

Je posterai du code quand je le trouverai ...

1

Je ne sais pas si cela va fonctionner dans mySQL mais SqlServer vous pouvez créer une fonction:

create function dbo.replaceIdsWithValues 
(
    @inIds varchar(50) 
) 
returns varchar(50) 
as 
begin 
    declare @ret as varchar(50) 
    set @ret = @inIds 
    select @ret = replace(@ret,cast(id as varchar),theValues) from t2 
    return @ret 
end 

puis appelez simplement:

select id, nos, dbo.replaceIdsWithValues(nos) from t1 

qui en supposant que votre structure de tables:

create table t1 (id int, nos varchar(50)) 
create table t2 (id int, theValues varchar(50)) 

Vous pouvez tester l'exemple complet

create table t1 (id int, nos varchar(50)) 
create table t2 (id int, theValues varchar(50)) 
insert into t1(id, nos) 
select 1, '12,13,14' 
union all select 2, '14' 
union all select 3, '14,12' 

insert into t2(id, theValues) 
select 12, 'PHP' 
union all select 13, 'JAVA' 
union all select 14, 'C++' 

select id, nos, dbo.replaceIdsWithValues(nos) from t1 
Questions connexes