2013-05-06 51 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