【问题标题】:Search ids in comma separated string with an input comma separated string使用输入逗号分隔字符串在逗号分隔字符串中搜索 id
【发布时间】: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,它只有两列TaskIdViewerId,然后您可以将该表与该任务表连接起来,例如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 行。仍在检查是否有更好的解决方案。

标签: php mysql


【解决方案1】:

你可以试试下面的代码:

$str = "SELECT * FROM tasks WHERE assign_to IN ($inputString) ";
$values = explode(",",$inputString);
foreach ($values as $val) {
    $str .= "AND viewers LIKE ".$val; //Replace AND with OR as per your requirement (Match all/ match any)
}

//execute query

这不是很有效,但可以完成任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    • 1970-01-01
    • 2016-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多