我在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的开头进行查询,它会使应用程序运行速度过慢。
答案 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', '');