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这些数据库第一次或他们会给你各种麻烦。