MySQL在逗号列表中进行search

我有一个MySQL字段引用另一个表,其中ID保存为逗号分隔列表,例如:

12,13,14,16 

代表另一个表中的值。 我知道这是非常糟糕的错误,但是这是来自上面,我不能做任何事情。 现在的问题是,我想用这样的查询在该字段中search:

 SELECT ... WHERE field LIKE '%1%' 

现在的问题显然是几乎所有的条目都可以在这个示例查询中find,因为最常见的ID在范围10-20。 我的想法是search%,1,%,但这不适用于字段中的第一个和最后一个ID。 有没有像内部replace或我如何解决这个最好的办法?

你需要FIND_IN_SET函数:

 SELECT ... WHERE FIND_IN_SET('1', field) 

请注意,普通的FIND_IN_SET不区分大小写,

FIND_IN_SET('b3','a1,a2,B3,b3')FIND_IN_SET('B3','a1,a2,B3,b3')都返回3。

为了区分大小写,在第一个参数中加上'binary'修饰符,例如FIND_IN_SET (binary 'b3', 'a1,a2,B3,b3')返回4。

正如其他人所说,Find_In_Set可以让你编写查询,但你真的需要看看你的数据库devise(我知道你知道这个…)

将外键包含在这样的分隔列表中的问题是,外键的整点是使您能够使用索引快速地在另一个表中定位信息。 按照您的想法实施数据库,您可以解决各种问题:

  • 如何防止重复(这会浪费空间)
  • 我如何删除给定的值(需要自定义function,导致错误的可能性?
  • 随着表格大小的增加,如何响应性能问题?

只有一个真正可以接受的方式来解决这个问题,而不是首先面对问题。

和那些高层的人聊聊天,并解释他们的解决scheme的问题 – 然后解释做好这项工作的好处。

如果他们甚至不会讨论这个问题,那么找一个有价值的雇主来为你的工作贡献一份工作。

马丁。

FIND_IN_SET是你最好的select

  SELECT ... WHERE FIND_IN_SET(1,field_name) 

在阅读这个问题后,我想补充说,如果你的逗号分隔列表有空格即(1,2,3,4),你将需要删除前/后空格或使用WHERE FIND_IN_SET(X,字段)或FIND_IN_SET('X ',字段)或FIND_IN_SET('X',字段)…..只是想我会分享,因为我遇到了这个问题…..只是要创build这些数据库第一次或他们会给你各种麻烦。