2016-05-03 1 views
1

J'ai deux tables A et B.Joignez-vous à des lignes du tableau A avec des colonnes de tableau B dans MySQL

Le tableau A contient une liste d'échantillons, qui sont numérotés, mais aussi id caractère. Il a la forme

 
sample_num sample_id 
1    id_1 
2    id_2 
.    . 
.    . 
.    . 
n    id_n 

Le Tableau B contient des données d'expression génique pour chaque échantillon. Il a la forme

 
probe_num  1 2 . . . n  
1    
2 
. 
. 
. 
m 

Idéalement je voudrais avoir des échantillons sous forme de lignes, et les gènes sous forme de colonnes, cependant, il y a trop de gènes pour MySQL pour stocker sous forme de colonnes je ne peux donc pas vraiment changer.

Maintenant, on me donne un sous-ensemble d'identifiants d'échantillons et on me demande de retourner les données d'expression génique associées. Mais je ne peux pas comprendre comment effectuer la jointure requise. Je dois rejoindre sur la colonne identifiants du tableau B avec la colonne sample_num du tableau A.

Ce serait facile si je pouvais, par exemple, transposer le tableau B, mais je ne sais pas si cela est possible ou pas donné la limitation sur le nombre de colonnes.

+1

Vous devez avoir une table de jonction avec une ligne par sonde et une expression. Stocker des "tableaux" de données dans des colonnes séparées est généralement une mauvaise idée. –

+0

Alors ... quelle est la structure exacte (et fixe) de la table B? Quels champs a-t-il? Lorsque vous faites référence à la colonne «identificateurs», vous voulez dire un champ avec ce nom, ou il se réfère au champ 1, ou au champ 2, ou ...? – MarcM

+0

@MarcM Les champs correspondent aux entrées de la colonne sample_num de la table A. La structure de la table B n'est pas réellement fixée, ce qui, je pense, est une mauvaise chose. Si un nouvel échantillon est ajouté, une nouvelle colonne est ajoutée à la table B et une nouvelle ligne est ajoutée au tableau A. –

Répondre

3

En ce qui concerne ce que vous dites dans un commentaire:

La structure du tableau B n'est pas fixe en fait, que je suppose est une mauvaise chose. Si un nouvel échantillon est ajouté, une nouvelle colonne est ajoutée à la table B et une nouvelle ligne est ajoutée à la table A.

De toute évidence, il s'agit d'un mauvais modèle relationnel.

Au lieu de cela, je vous suggère d'utiliser un autre aproche (celui utilisé pour n: relations m)

Table B 
probe_num gene_num gene_value 
1   1  value_for_gene_1_of_probe_1 
1   2  value_for_gene_2_of_probe_1 
1   3  value_for_gene_3_of_probe_1 
1   4  value_for_gene_4_of_probe_1 
...and so on for probe_1 
2   1  value_for_gene_1_of_probe_2 
2   2  value_for_gene_2_of_probe_2 
2   3  value_for_gene_3_of_probe_2 
2   4  value_for_gene_4_of_probe_2 

Maintenant, vous pouvez stocker des informations de gènes différents pour différents sondes. Si de nouvelles données liées à de nouveaux gènes apparaissent, il n'est pas nécessaire de modifier la structure des données. Ajoutez simplement de nouvelles lignes à la table. Tels que

probe_num gene_num gene_value 
15  2714  value_for_gene_2714_of_probe_15 

Votre table sera probablement beaucoup de lignes

Pour obtenir toutes les informations de gène lié à la sonde 15 (pas un problème!):

SELECT * FROM TABLE_B 
WHERE probe_num = 15; 

Enfin, vous pouvez rapporter avec la table A comme suit:

SELECT * FROM TABLE_B 
JOIN TABLE_A ON TABLE_A.sample_num = TABLE_B.sample_num 
WHERE TABLE_A.sample_id LIKE 'id_2';