Php mysql选择查询中匹配delimeter(|)分隔值字段
在我的mysql表中,其中一个字段存储了(1 | 2 | 3)这样的值Php mysql选择查询中匹配delimeter(|)分隔值字段,php,mysql,database,sql-like,Php,Mysql,Database,Sql Like,在我的mysql表中,其中一个字段存储了(1 | 2 | 3)这样的值 id Skills ---- -------- 1 1|2|3|5 2 2|4|5 3 4|6|3 4 5|2|3|1 我想根据匹配的技能搜索并列出id。如果我想列出包含3的技能id,我必须列出id1,3,4。例如,如果我想列出包含1,5(1或5或两者)(如多个值1,4,3)的技能id,那么我想列出1,2,4(我也想列出2)。任何帮助都将不胜感激 提前感谢。使用
id Skills
---- --------
1 1|2|3|5
2 2|4|5
3 4|6|3
4 5|2|3|1
我想根据匹配的技能搜索并列出id。如果我想列出包含3
的技能id,我必须列出id1,3,4
。例如,如果我想列出包含1,5(1或5或两者)
(如多个值1,4,3)的技能id,那么我想列出1,2,4(我也想列出2
)。任何帮助都将不胜感激
提前感谢。使用
但实际上,您应该更改数据库结构。始终在列中存储单个值以避免此类问题 这可能有助于:
SELECT * FROM YOUR_TABLE
WHERE Skills REGEXP '[[:<:]]1[[:>:]]' = 1
OR Skills REGEXP '[[:<:]]5[[:>:]]' = 1
从您的_表中选择*
其中技能REGEXP'[[::]]'=1
或技能REGEXP'[[::]]'=1
您试过这个吗<代码>mysql>选择在_集合中查找_('3','1 | 3')代码>它仅适用于逗号分隔的字符串手动状态:“字符串列表是由“,”字符分隔的子字符串组成的字符串。”。我看到您现在执行了一个replace()
,但这会影响性能,因为它会执行完整的表扫描。谢谢您的提示。没有注意到|
“任何帮助都将不胜感激。”-太好了,下面是:拿起一本关于规范化的书。您需要一个Person\u Skills
junction表,在这里您可以在每一行上链接PersonID
和SkillID
。单个列中的分隔值只是等待发生的灾难。如果你想为所有人移除技能5,或者想找到所有拥有技能2但没有技能3的人,等等,那该怎么办。谢谢。这个正则表达式要匹配整个单词。也就是说,如果你有1 | 2 | 3,那么1,2和3是整个单词。你也可以尝试find_in_set
solution with replace,我认为这是更好的解决方案。我已经尝试了find in set和REGEXP,都很有效,谢谢。
SELECT * FROM YOUR_TABLE
WHERE Skills REGEXP '[[:<:]]1[[:>:]]' = 1
OR Skills REGEXP '[[:<:]]5[[:>:]]' = 1