2009-06-30 8 views
0

Mysql:Une requête SQL pour former des données

Table_A 
------------ 
id name 
1 Name1 
2 Name2 


Table_B 
------------ 
a_id type value 
1 width 100 
1 height 100 
1 color red 
2 width 50 
2 height 80 

On ne sait pas combien de de type valeurs existent dans Table_B.

comment obtenir le résultat que:

id name width height color 
1 Name1 100 100  red 
2 Name2 50 80  null 

Répondre

1
SELECT a.id, a.name, b_Width.value AS width, b_Height.value AS height, b_color.value AS color 
FROM Table_A AS a 
JOIN Table_B AS b_Width 
    ON b_Width.a_id = a.id AND b_Width.type = 'width' 
JOIN Table_B AS b_Height 
    ON b_Height.a_id = a.id AND b_Height.type = 'height' 
JOIN Table_B AS b_Color 
    ON b_Color.a_id = a.id AND b_Color.type = 'color' 

Mais sérieusement prendre en compte la refonte de votre schéma. la valeur tient les couleurs et les dimensions linéaires, ce serait mieux si elle était conçue différemment.

Conservez TableA de la façon dont il se présente mais disposez ensuite d'une table appelée Détails qui contient des colonnes largeur/hauteur/couleur. Ou ayez une table appelée Taille avec des colonnes de largeur/hauteur et une table appelée Couleur avec le nom de couleur ou la valeur RVB. Chaque table supplémentaire a bien sûr un FK à TableA qui peut ou non être utilisé comme PK de cette table.

0

utilisation requête de sélection avec des sous requêtes

comme id select, Nom, (sélectionner le type de table_B où a_id = table_A.id et type = 'width') que la largeur de TABLE_A

même comme cela, vous peut ajouter d'autres colonnes dont vous avez besoin ok

1

Eh bien, je ne recommanderais pas d'utiliser l'anti-pattern EAV pour les bases de données car il contient essentiellement des données non structurées dans une base de données structurée, mais j'ai déjà dû me battre avec voici quelque chose beaucoup beaucoup plus rapide que les jointures internes

select a.id, a.name, max (cas lorsque b.type = 'hauteur' puis b.value fin) en tant que hauteur, max (cas où 'largeur' b.type = puis b. valeur fin) comme largeur, max (cas où b.type = 'couleur' ​​puis b.value end) comme couleur de test.tablea a, test.tableb b où a.id = b.a_id groupe par a. id

Questions connexes