2010-11-06 4 views
1

Ma structure db:rejoindre sql intérieure - plusieurs colonnes au lieu de lignes

t_data_fields 
id | field_name | field_value 

t_data 
id | fields_id | name | 

Chacune des lignes t_data ont un certain nombre de lignes qui y sont associées dans la table t_data_fields. Au lieu de joindre des data_fields de largeur de données et d'obtenir plusieurs lignes pour chaque entrée de données, je me demandais s'il était possible d'ajouter les extra field_name et field_value à la ligne t_data d'origine.

Ainsi, au lieu de:

id fields_id name field_name field_value 
2 1   row2 color  black 
2 1   row2 brand  DG 
2 1   row2 type  shirt 

Je veux que le résultat comme celui-ci:

id fields_id name field_name field_value field_name field_value field_name field_value 
2 1   row2 color  black  brand  DG   type  shirt 

que je pouvais faire la première version, je suis curieux de voir s'il est possible d'obtenir le jeu de résultats comme je le voudrais

+0

L'ID est-il correct dans votre exemple pour les données de votre table t_data_field? Utilisez-vous des touches composites? – frogstarr78

Répondre

1

Vous pouvez REJOINDRE une table plusieurs fois en utilisant un alias différent à chaque fois, mais cela ne va pas bien évoluer, et ce n'est pas flexible.

A en juger par ce que vous semblez faire ici, il serait beaucoup plus judicieux pour vous de définir vos modèles/schéma un peu plus clairement afin que tout produit donné a des attributs particuliers appelés color, brand, size, type, etc. et leur permettre d'être NULL. Ensuite, vous avez une ligne vraiment propre avec toutes les données dont vous avez besoin et vous utilisez MySQL comme prévu. Ne vous inquiétez pas d'avoir beaucoup de colonnes: MySQL est bien d'avoir 50 colonnes, bien qu'il soit moins respectueux de l'homme (attention, il y a une limite de longueur de ligne, donc faites attention si vous avez beaucoup de varchars longs).

L'autre option, en supposant que vous ayez besoin d'attributs arbitraires, consisterait à stocker les données encodées dans un champ TEXT dans la base de données dans une seule colonne (je recommande JSON si vous suivez cette route). Cependant, il est beaucoup plus difficile d'effectuer des opérations de base de données sur les données de cette façon, donc il y a certainement un compromis.

+0

J'ai besoin d'attributs arbitraires. Merci pour votre réponse, fait parfaitement sens. Je pourrais utiliser JSON pour cela dans le futur car je n'ai pas besoin d'effectuer des opérations sur ces données "supplémentaires". – Baversjo

0

Hmm, pourquoi? Mais non, ne peut pas faire. Si vous voulez présenter le résultat comme dans la dernière version, faites-le dans votre programmation derrière la requête SQL.

+0

La raison serait moins de données sur le fil. Ouais c'est ce que je fais :) – Baversjo

Questions connexes