mysql db查询逗号分隔值

时间:2013-09-06 11:57:43

标签: mysql sql comma

我有像某些东西的价值

 | UserName   |    SkillsID      |
 |------------|------------------|
 | Sohil      |    1,2,15,16,19, |
 | Ankur      |    5,8,14,19,    |
 | Lalu       |    4,3,14,15,    |
 | Vinod      |    5,            |
 | Milind     |    8,11          |

现在我想搜索已经获得SkillsID = 5然后结果

的用户
 | UserName   |    SkillsID      |
 |------------|------------------|
 | Ankur      |    5,8,14,19,    |
 | Vinod      |    5,            |

我的查询将如何?

我曾考虑将SkillsID拆分为表格&然后对它执行查询,但我不知道分裂。任何人都可以帮助我吗?

提前感谢帮助者..

3 个答案:

答案 0 :(得分:2)

从不,永远不会在一列中存储多个值!

如您所见,这只会导致问题。请首先像这样标准化您的数据库结构

 User table  
+-------------------+ 
| userid | username |
+-------------------+
|   1    |  Sohil   |
|   2    |  Ankur   |
+-------------------+

 skill table
 --------------------
 | Userid| SkillID  |
 |-------|----------|
 | 1     |    1     |
 | 1     |    2     |
 | 1     |    15    |
 | 1     |    16    |
 ...
 | 2     |    5     |
 | 2     |    8     |
 | 2     |    14    |
 ...

答案 1 :(得分:2)

您可以使用FIND_IN_SET()函数或正则表达式执行此操作:

SELECT * FROM t WHERE SkillsID REGEXP '(^|,)5($|,)'

但是你违反了关系数据库原则,在一个字段中存储了多个值。您应该创建一个链接表来正确存储它,并为其中的用户表创建一个外键。

答案 2 :(得分:0)

您可以使用以下查询将值虚拟地分成不同的列,然后您可以使用此查询作为子查询运行查询。

select 
substring_index(column_name,',',1) c1,
substr(column_name,length(substring_index(column_name,',',1))+2,length(substring_index(column_name,',',2))-length(substring_index(column_name,',',1))-1) c2,
substr(column_name,length(substring_index(column_name,',',2))+2,length(substring_index(column_name,',',3))-length(substring_index(column_name,',',2))-1) c3,
substr(column_name,length(substring_index(column_name,',',3))+2,length(substring_index(column_name,',',4))-length(substring_index(column_name,',',3))-1) c4,
substr(column_name,length(substring_index(column_name,',',4))+2,length(substring_index(column_name,',',5))-length(substring_index(column_name,',',4))-1) c5,
substr(column_name,length(substring_index(column_name,',',5))+2,length(substring_index(column_name,',',6))-length(substring_index(column_name,',',5))-1) c6
from table_name