2014-01-17 63 views
0

我想知道什麼是存儲多個複選框值以方便搜索的最佳方式。多選複選框sql設計

如果技能表(足球,游泳,跳舞......)有任何優勢,我分配唯一的ID或我應該使用一個唯一的字符串 - 確切的單詞存儲在數據庫中?

如果答案是「數字」,並且總可用選項多於「10」,我應該從10開始遞增ID,這樣可以避免在%2%時查找12,2,22% 14,23,34 /足球,游泳,在用戶桌上跳舞。

有沒有更好的方法?

+0

這真的不清楚你問什麼,或者問題是什麼。我假設你正在談論將「技能」映射到「人」或這種性質的東西?一般來說,我想像會有一個'技能'表和一個'人'表,以及一個'PersonSkills'表,它們以多對多的關係連接起來。還有什麼,你想避免什麼? – David

+0

是的。有一個用戶表和一個技能表,我需要爲每個用戶分配所有可用的滑雪板。 我習慣於存儲以逗號分隔的字符串值,但是我看到其他網站將數值分配給他們的chioices,這只是讓我懷疑是否有什麼我做錯了。 – valiD

回答

1

使用3個表:

  1. Person表。這包含單值賦予的名稱,生日等。
  2. Skills表。這包含每個技能的名稱。
  3. PersonSkills表。這是一個關係表,它包含前兩個表之間的多對多關係。它有兩列:Person_idSkill_id,它們是前兩個表中的外鍵。

要獲得所有的技能,你加入的表:

SELECT person_name, GROUP_CONCAT(skill_name) skills 
FROM Person p 
LEFT JOIN PersonSkills ps ON p.person_id = ps.person_id 
JOIN Skills s ON s.skill_id = ps.skill_id 

要獲得所有與特定技能的人:

SELECT person_name 
FROM Person p 
JOIN PersonSkills ps ON p.person_id = ps.person_id 
JOIN Skills s ON s.skill_id = ps.skill_id 
WHERE skill_name = "swimming" 
+0

我有很大的機會搜索超過1個選擇表。 眼睛的顏色,語音訓練,樂器。 查詢哪裏我喜歡找到所有研究鋼琴和紅頭髮跳舞的人都是一團糟還是會前進? – valiD

+0

這有點複雜,特別是因爲你似乎是一個SQL新手。但你應該能夠找到顯示如何去做的SO問題。 – Barmar

+0

可以嗎? SELECT u.id FROM'users'ù JOIN'skills_users'スON u.id = su.user JOIN'skills' S ON s.id = su.skill JOIN'instruments_users' IU U上.ID = iu.user JOIN'instruments'我開i.id = iu.instrument WHERE s.name = '手球' AND i.name = 'flaut' 它是確定使用盡可能多的== = JOIN'instruments_users' iu ON u.id = iu.user JOIN'instruments' i ON i.id = iu.instrument ===因爲我需要嗎? 或者我應該堅持我以前的方式:SELECT * FROM'users WHERE instruments like'%flaut%'AND'skills' LIKE'handball'? – valiD