2015-08-20 36 views
0

表名稱屬性名,我需要創建存儲多個值的屬性爲這樣的表:加入MySQL中

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

網上通緝後,該解決方案似乎是涉及到單獨的表作爲這樣和加盟其中:

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

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

兩個問題:

  1. 這是做了正確的方法是什麼?約翰和哈里的桌子預計會很大。
  2. 如何自動爲每個人使用表名稱作爲其各自的名稱創建一個表格,以及如何從表格main中的人員John找到表格「John」?
+1

不要存放的東西(如興趣愛好)列出了一個分隔字符串。 SQL有這個偉大的數據結構來存儲列表;它被稱爲*表*。 –

+0

這就是爲什麼我說,在網上查找解決方案似乎在於創建名爲John和Harry的表格,因爲存儲列表不是選項。 –

+0

1.否2.不要。我建議你閱讀關於「主鍵」和「外鍵」,並忘記任何在線教程建議你,這個可怕的設計。 – rlanvin

回答

1

我認爲以下設計可能適合您。

[PERSON]

PERSON ID(PRIMARY KEY), NAME

[HOBBY]

HOBBY ID(PRIMARY KEY), HOBBY

[PERSON_HOBBY]

PERSON_ID(PRIMARY KEY,FOREIGN KEY to PERSON), HOBBY_ID(PRIMARY KEY,FOREIGN K EY前往Hobby), TIME_SPENT

下面的語句應該爲新的設計工作:

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

不要對列別名使用單引號(只會導致未來的問題)。另外,如果表具有適當的外鍵關係(它們應該具有),則不需要「LEFT JOIN」。 –

+0

除了@GordonLinoff所說的話,如果你想擁有一個人員列表,包括沒有*愛好的人員,你應該選擇'PERSON'(在這種情況下,'LEFT JOIN'是有保證的)。 – rlanvin