2015-07-21 117 views
1

我在網址列數據庫裏面以下行:比較整數

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

隨着記錄的增長,您的應用程序將放慢速度,您將發出全表掃描。接受的答案不是最佳解決方案。未來的遊客應該注意這一點。 – Mjh

回答

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', ''); 
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' 

我想這應該這樣做。當然你也必須運行查詢。

+0

但數組只包含id,而不是url。網址位於數據庫中。 – khernik

+0

我的錯誤。我誤解了這個問題。 – Emil

+0

Se我已更新的答案。 – Emil

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提取從URL數量沒有浪費太多時間

給定的URL是這樣的: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柱也被收錄在同一時間。

當然,您可以忽略我寫的所有內容,並嘗試其他答案,這些答案是醜陋的黑客,最糟糕的是 - 他們都是全表掃描。