我在数据库的url列中有以下行:

http://some_url/something/34123122.json
http://some_url/something/53124322.json
http://some_url/something/22214322.json

我想在某个函数中检索它们,比如(伪代码):
function retrieve($ids) {
   return $this->fetchAll("SELECT * FROM table WHERE url IN $ids");
}

问题是$ids参数必须是一个数组,其中的id只能来自这些url,例如:
array(
  [0] => 34123122
  [1] => 22214322
)

因此,我必须在这个函数中执行一些操作,以便能够检索包含这些id的url行。我该怎么做?url可以更改,但/******.json结尾的模式始终相同。
我不想让另一个查询选择url的开头,这会使应用程序太慢。

最佳答案

必须在mysql中使用regex,更改函数:

function retrieve($ids) {
    $regex = '('.implode('|', $ids).').json$';
    return $this->fetchAll("SELECT * FROM table WHERE url REGEXP '$regex'");
}

注意:对于大型表,这不是最佳解决方案。我建议您在表中创建一个id字段,如果所有id都是唯一的,那么您可以将id作为主键。同样,每当您在该表中插入时,从url中取出id部分并将其插入id字段。这样你就可以跳过regex了。如果您愿意创建一个id字段,那么可以执行以下查询来更新当前的表id字段:
mysql> update your_table_name set id=replace(substring_index(url, '/', -1), '.json', '');

07-24 09:38
查看更多