【发布时间】:2014-02-12 09:20:45
【问题描述】:
考虑表任务
id | assigned_to | viewers
1 100 100,200,300
2 200 125,200,310
3 300 175,250,300
4 400 400,440,670
5 500 500,111,333
我将得到一个可能包含超过 1000 个逗号分隔值的输入字符串,例如
1,2,3,4,5,6,7,8,,,,100,,,,500,,,,1000
我想从表中获取与输入字符串中的“assigned_to”或“viewers”匹配的所有行。我已经尝试使用 IN() 来表示“assigned_to”,
SELECT * FROM tasks WHERE assign_to IN ($inputString)
但随后无法找到与“viewers”列匹配的任何解决方案。
有没有办法将逗号分隔的字符串与另一个逗号分隔的字符串匹配?
提前致谢
【问题讨论】:
-
标准化您的数据库
-
如果你可以重构你的数据库结构,这个任务会容易得多:在
relational database中包含multiple values in one column of one row通常被认为是不好的做法;viewers真的应该在一个单独的表中,并且只能通过外键引用;这将引入一个新表TaskViewers,它只有两列TaskId和ViewerId,然后您可以将该表与该任务表连接起来,例如SELECT tasks.* FROM tasks INNER JOIN taskviewers ON tasks.id = taskviewers.taskid WHERE tasks.assign_to IN ($inputString) OR taskviewers.viewerid IN ($inputString) -
感谢您的回复。创建一个新表是可能的,但是要在很多地方修改代码。是的,一旦完成,头痛就结束了。
-
@AbhikChakraborty:我尝试过使用 FIND_IN_SET(),我可能需要遍历每个值的输入字符串,并且查询长度将超过 1000 行。仍在检查是否有更好的解决方案。