2013-05-06 102 views
0

在我的mysql表中,其中一個字段的值存儲在(1 | 2 | 3)中。在mysql中匹配delimeter(|)分隔值字段select查詢

id Skills 
---- -------- 
    1 1|2|3|5 
    2  2|4|5 
    3 4|6|3 
    4 5|2|3|1 

我想根據匹配的技能搜索並列出ID。如果我想列出包含3的技能ID,我必須列出ID 1,3,4。就像我想列出包含1,5 (either 1 nor 5 or both)(如多個值1,4,3)的技能的id,那麼我想列出1,2,4(i want to list 2 also)。任何幫助可以不勝感激。

在此先感謝。

+3

_「任何幫助會不勝感激。」 _ - 太好了,這裏有雲:拿起一本書上的正常化。你需要一個'Person_Skills'聯結表,你可以在每一行鏈接'PersonID'和'SkillID'。單列中的分隔值僅僅是一個等待發生的災難。如果你想爲所有人移除技能5,或者想要找到所有技能2但不是技能3的人,等等。 – CodeCaster 2013-05-06 10:54:34

回答

1

使用FIND_IN_SET

select id 
from your_table 
where find_in_set('3', replace(skills, '|',',') > 0 

select id 
from your_table 
where find_in_set('3', replace(skills, '|',',')) > 0 
or find_in_set('5', replace(skills, '|',',')) > 0 

但你應該真正改變你的數據庫結構。始終將單個值存儲在列中以避免出現此類問題!

+1

你有試過嗎? 'mysql> select FIND_IN_SET('3','1 | 3');'它僅適用於以逗號分隔的字符串 – 2013-05-06 10:53:33

+0

手動狀態:_「字符串列表是由由」,「字符」_「分隔的子字符串組成的字符串。我看到你現在做了一個'replace()',但這會損害性能,因爲它會執行全表掃描。 – CodeCaster 2013-05-06 10:55:44

+0

感謝您的提示。沒有注意到'|' – 2013-05-06 11:00:01

1

這可能會幫助:

SELECT * FROM YOUR_TABLE 
WHERE Skills REGEXP '[[:<:]]1[[:>:]]' = 1 
OR Skills REGEXP '[[:<:]]5[[:>:]]' = 1 
+0

謝謝。該REGEXP [[:<:]]是否也與其他的定界符匹配。 – 2013-05-06 11:07:27

+0

這個正則表達式匹配整個單詞。也就是說,如果你有1 | 2 | 3那麼1,2和3是整個詞 – 2013-05-06 11:11:43

+0

你也可以嘗試'find_in_set'解決方案替換,我認爲這是更好的解決方案。 – 2013-05-06 11:13:00