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 仅适用于第一个整数?的主要内容,如果未能解决你的问题,请参考以下文章