比较数据库中url内的整数

时间:2015-07-21 08:35:00

标签: php mysql

我在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的数组,例如:

array(
  [0] => 34123122
  [1] => 22214322
)

所以我必须在这个函数中做一些事情,以便我可以检索包含那些id的url的行。我怎样才能做到这一点?网址可以更改,但/******.json结尾始终具有相同的模式。

我不想再选择url的开头进行查询,它会使应用程序运行速度过慢。

3 个答案:

答案 0 :(得分:2)

执行此操作的正确方法是仅查询您感兴趣的数据部分 - 数字。因此,您可以通过执行附近的任务获得即时+10智能,并确定您可以创建另一列来保存该号码。你的表现在看起来像这样:

CREATE TABLE mytable (
    id int not null auto_increment,
    url varchar(255) not null,
    json_number int not null,
    PRIMARY KEY(id),
    INDEX(json_number)
) ENGINE = InnoDB;

在插入表格之前,您使用integer sanitizing filter从网址中提取数字而不会浪费太多时间

给定这样的网址:http://some_url/something/34123122.json您可以轻松提取如下数字:

$url = 'http://some_url/something/34123122.json';
$number = filter_var($url, FILTER_SANITIZE_NUMBER_INT);

echo $number; // echoes 34123122

现在您的查询很简单,您检查同时也被编入索引的json_number列。

当然,你可以忽略我写的所有内容,并尝试其他难看的黑客和最糟糕的答案 - 它们都是全表扫描。

答案 1 :(得分:0)

我不知道这是否是一个简洁的解决方案,但它应该有用。

function getData($ids) {

    foreach($ids as $item) {

        $str[]  = $item . ".json";

    }

    $where  = "";

    foreach($str as $item) {

        $where .= "url LIKE '%$item' OR ";

    }

    return substr("SELECT * FROM table WHERE " . $where, 0, -4);    

}

$ids = array(34123122, 53124322, 22214322);
echo getData($ids);

<强>结果:

SELECT * FROM table WHERE url LIKE '%34123122.json' OR url LIKE '%53124322.json' OR url LIKE '%22214322.json'

我认为应该这样做。当然,您还必须运行查询。

答案 2 :(得分:0)

你必须在mysql中使用正则表达式,改变你的功能:

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

注意:这不是大表的最佳解决方案。我建议你在表中创建一个id字段,如果所有id都是唯一的,那么你可以将id作为主键。此外,无论何时插入该表,请从url中取出id部分并将其插入到id字段中。通过这种方式,您可以跳过正则表达式。如果您愿意创建一个id字段,那么您可以执行以下查询来更新当前的表id字段:

mysql> update your_table_name set id=replace(substring_index(url, '/', -1), '.json', '');