MySQL FIND_IN_SET OR IN 仅适用于第一个整数?

Posted

技术标签:

【中文标题】MySQL FIND_IN_SET OR IN 仅适用于第一个整数?【英文标题】:MySQL FIND_IN_SET OR IN only work for first integer? 【发布时间】:2018-06-28 09:02:42 【问题描述】:

这不是重复问题,我已阅读搜索标题中提到的所有其他答案。

我的 mysql 查询应该从表字段“employee_id”中获取整数值。

我的桌子:

我的查询是:

SELECT `task_allotment`.`task_id`, `task_allotment`.`sub_proj`, `task_allotment`.`project_id`, `task_allotment`.`task_name`, `task_allotment`.`task_date`, `task_allotment`.`task_status`, `task_allotment`.`assign_by`, `project`.`provider_id` FROM `task_allotment` INNER JOIN `project` ON `task_allotment`.`project_id` = `project`.`project_id` WHERE FIND_IN_SET(9, `task_allotment`.`employee_id`) && `task_allotment`.`task_status` !="Complete" ORDER BY `task_allotment`.`task_id` DESC

它返回空结果:

它仅适用于第一个整数,但不适用于任何其他整数。 示例:

如果查询是:

SELECT `task_allotment`.`task_id`, `task_allotment`.`sub_proj`, `task_allotment`.`project_id`, `task_allotment`.`task_name`, `task_allotment`.`task_date`, `task_allotment`.`task_status`, `task_allotment`.`assign_by`, `project`.`provider_id` FROM `task_allotment` LEFT JOIN `project` ON `task_allotment`.`project_id` = `project`.`project_id` WHERE FIND_IN_SET(1, `task_allotment`.`employee_id`) && `task_allotment`.`task_status` !="Complete" ORDER BY `task_allotment`.`task_id` DESC

它返回正确的结果:

如果我使用“FIND_IN_SET(13, task_allotment.employee_id)”查询“employee_id”开头的整数,您可以在上面看到它返回正确的结果,但是如果我查询任何其他整数返回空结果。我不确定是否只适用于第一个整数?

请指导我如何使用其他整数获得正确的结果。

【问题讨论】:

我喜欢以“这不是重复的问题”开头的问题......通常是这样。 【参考方案1】:

看起来employee_id 中存储的字符串不是正确的逗号分隔值,它在每个逗号后都包含空格,这就是它不起作用的原因,请参阅here。

SELECT FIND_IN_SET(5, '1, 2, 4, 5, 6'); // returns 0
SELECT FIND_IN_SET(CONCAT(' ',5), '1, 2, 4, 5, 6'); // returns index 4 but won't work for first value
FIND_IN_SET(1, REPLACE('1, 2, 4, 5, 6', ', ',',')) //  returns index 1, this will for all values

将关系存储在单行中确实是一个糟糕的设计,您应该normalize您的数据并将每个元组(task_id,employee_id)保存在称为联结/数据透视表的新表中的单行中,这种方式你不会有这些问题

【讨论】:

感谢您的有益建议。是的,我做了非常糟糕的设计,我会做正确的。我接受您的回答,因为它会返回正确的结果。 @KuntalParbat 您需要先使用 replace 您的列,然后您可以在 set 中使用 find ,请参阅updated demo 如果我使用 str_replace(' ', '', $employee_id);或者 preg_replace('/\s+/', '', $employee_id) 在保存之前不会出现这个问题吧? @KuntalParbat 是的,在保存时从您的 csv 字符串中删除任何空格【参考方案2】:

如果你在整数中有空格,我可以看到1, 2, 4, 5, 7,..,那么它将不起作用。我有同样的问题。

解决方案: mysql 中的REPLACE 函数可以提供帮助。只需将该特定字段中的所有空格替换为空白字符串''

UPDATE `TABLENAME` SET `employee_id` = REPLACE(`employee_id`, ' ', '')

注意:下次用空格保存值时要小心。

【讨论】:

这个解决方案对我有用。我需要在保存之前删除空间吗? 由于您已经替换了数据库中的空格,现在应该保存新记录而不使用空格。

以上是关于MySQL FIND_IN_SET OR IN 仅适用于第一个整数?的主要内容,如果未能解决你的问题,请参考以下文章

mysql 中find_in_set()和in()用法比较

mysql 使用 FIND_IN_SET 来查询数据

MySQL find_in_set 与多个搜索字符串

mysql中的find_in_set()函数

mysql中的find_in_set()函数

MYSQL中 find_in_set() 函数用法详解