MySQL在逗号列表中搜索

时间:2011-03-28 12:02:43

标签: mysql

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

12,13,14,16

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

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

现在的问题很明显,几乎所有条目都可以通过此示例查询找到,因为最常见的ID位于范围10-20中。我的想法是搜索%,1,%,但这不适用于该字段中的第一个和最后一个ID。我有类似内部替换的东西,或者我如何以最好的方式解决这个问题?

5 个答案:

答案 0 :(得分:68)

您需要FIND_IN_SET功能:

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

答案 1 :(得分:17)

请注意,FIND_IN_SET不区分大小写,

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

要区分大小写,请将“二进制”修饰符添加到第一个参数,例如FIND_IN_SET (binary 'b3', 'a1,a2,B3,b3')返回4.

答案 2 :(得分:7)

正如其他人所说,Find_In_Set会让你编写查询,但你真的需要看看你的数据库设计(我知道你知道这个......)

在这样的分隔列表中包含外键的问题在于,外键的重点是使您能够使用索引快速定位另一个表中的信息。通过实现您拥有的数据库,您可以解决各种问题:

  • 如何防止重复(会浪费空间)
  • 如何删除给定值(需要自定义函数,导致错误的可能性?
  • 当表格大小增加时,如何回应性能问题?

只有一种真正可以接受的解决方法 - 首先不要面对问题。

与高层人士聊天,并解释他们的解决方案的问题 - 然后解释正确完成工作的好处。

如果他们甚至不讨论这一点,那就找一份合适的雇主来评价你的贡献。

马丁。

答案 3 :(得分:3)

阅读此问题之后我想补充一点,如果你的逗号分隔列表有空格,即(1,2,3,4),你需要删除前导/尾随空格或使用WHERE FIND_IN_SET(X,field)或FIND_IN_SET (' X',字段)或FIND_IN_SET(' X',字段).....我想我分享了这个问题,因为我遇到了这个问题...... ..只需要在第一时间创建这些数据库,否则它们会给你带来各种麻烦。

答案 4 :(得分:2)

FIND_IN_SET是您最好的选择

 SELECT ... WHERE FIND_IN_SET(1,field_name)