2015-08-20 3 views
0

Je dois créer une table qui stocke plusieurs valeurs pour un attribut comme si:attribut de jointure nom nom de table dans MySQL

Table Main 
____________________________________________________ 
| Person  |  Hobbies  |TimeSpent(hrs) | 
---------------------------------------------------- 
| John  | gardening, guitar | 2,4   | 
| Harry  |  programming | 8   | 
---------------------------------------------------- 

Après avoir regardé en ligne, la solution semble être impliquant des tables séparées comme ainsi et se joindre à les:

Table John 
| Hobbies  | TimeSpent | 
--------------------------- 
| Gardening | 2  | 
| Guitar | 4  | 
--------------------------- 

Table Harry 
| Hobbies  | TimeSpent | 
--------------------------- 
| Programming| 8  | 
--------------------------- 

Deux questions:

  1. Est-ce la bonne façon de le faire? Les tables John et Harry devraient être énormes.
  2. Comment créer automatiquement une table pour chaque personne avec le nom de la table comme noms respectifs et comment puis-je trouver la table "John" de la personne John dans la table principale?
+1

Ne pas stocker des listes de choses (comme passe-temps) dans une chaîne délimitée. SQL a cette excellente structure de données pour stocker des listes; C'est ce qu'on appelle une * table *. –

+0

C'est pourquoi j'ai dit qu'après avoir regardé en ligne, la solution semblait résider dans la création de tables appelées John et Harry car le stockage de listes n'est pas une option. –

+0

1. Non 2. Ne pas. Je vous suggère de lire à propos des "clés primaires" et des "clés étrangères", et d'oublier le tutoriel en ligne qui vous a suggéré ce design horrible. – rlanvin

Répondre

1

Je pense que le design suivant peut fonctionner pour vous.

[PERSON]

ID PERSONNE (clé primaire), NOM

[HOBBY]

ID HOBBY (clé primaire), HOBBY

[PERSON_HOBBY]

PERSON_ID (CLÉ PRIMAIRE, CLÉ ÉTRANGÈRE DE LA PERSONNE), HOBBY_ID (CLÉ PRIMAIRE, K EY À HOBBY), TIME_SPENT

La déclaration suivante devrait fonctionner pour la nouvelle conception:

SELECT p.NAME, GROUP_CONCAT(h.HOBBY ORDER BY ph.HOBBY_ID ASC SEPARATOR ',') AS 'HOBBIES', 
GROUP_CONCAT(ph.TIME_SPENT ORDER BY ph.HOBBY_ID ASC SEPARATOR ',') AS 'HOURS SPENT' 
FROM PERSON_HOBBY ph 
LEFT JOIN PERSON p ON p.PERSON_ID = ph.PERSON_ID 
LEFT JOIN HOBBY h ON h.HOBBY_ID = ph.HOBBY_ID 
GROUP BY ph.PERSON_ID; 
+2

N'utilisez pas de guillemets simples pour les alias de colonnes (cela ne fait que conduire à des problèmes futurs). En outre, 'LEFT JOIN' est inutile si les tables ont les bonnes relations de clés étrangères (ce qu'elles devraient avoir). –

+0

En plus de ce que dit @GordonLinoff, si vous voulez avoir une liste de personnes, y compris des personnes * sans * un passe-temps, vous devez sélectionner "PERSON" (et dans ce cas le "LEFT JOIN" est garanti). – rlanvin