2010-02-12 3 views
1

Structure de la base de données avec deux connexions 1-n.SQL comment mapper une ligne à une colonne?

User table 
========== 
user_id 

Attribute table 
=============== 
attribute_id 
user_id 
attribute_name 

Attribute_Value table 
===================== 
attribute_value_id 
attribute_id 
attribute_value 

Est-il possible que je puisse recevoir les données dans le style de la ligne suivante:

user_id | firstname | lastname 
--------------------------- 
1  | Simon  | Smith 
2  | John  | Doe 

name est la première entrée attribute_name de la table d'attributs et lastname le second.

Répondre

1

La seule façon que vous pouvez le faire avec un nombre dynamique de colonnes est d'utiliser l'utilisation d'une instruction SQL sql dynamique pour générer une autre par concaténation de chaîne.

Éditer: Je ne suis pas sûr que cela soit possible dans mysql car il n'y a pas de commande de pivot. Faites-moi savoir si vous voulez voir un exemple de requête de MS Sql que j'ai écrit. C'est un modèle de données similaire, mais il y a juste beaucoup plus de champs/jointures.

Aussi je tiens à souligner que vous avez une faille dans votre conception si les noms d'attributs liquidation ne pas être unique.

+0

MySQL ne prend pas en charge la syntaxe PIVOT. –

+0

oui je sais. Je viens de remarquer l'étiquette mysql. – Shawn

+0

Son nécessaire pour MySQL – powtac

1

Puisque vous connaissez les noms des valeurs que vous recherchez, une jointure fera l'affaire.

select 
    u.user_id, 
    a1.attribute_value as firstname, 
    a2.attribute_value as lastname 
from User u 
inner join Attribute a1 
on u.user_id = a1.user_id 
and a1.attribute_name = 'name' 
inner join Attribute_Value v1 
on a1.attribute_id = v1.attribute_id 
inner join Attribute a2 
on u.user_id = a2.user_id 
and a2.attribute_name = 'lastname' 
inner join Attribute_Value v2 
on a2.attribute_id = v2.attribute_id 

ou ainsi (n'a pas exécuté ceci). Utilisez les jointures à gauche si tout le monde n'a pas de prénom ou de nom.

+0

> une jointure fera l'affaire. ce n'est pas vrai, regardez le format des données de résultat – Shawn

+0

Je ne connais pas les valeurs dans attribute_name! – powtac

+0

Je pensais avoir lu dans votre question qu'ils sont «nom» et «nom de famille», mais alors, peut-être que je regarde l'écran depuis trop longtemps. – cdonner

Questions connexes