2010-01-01 134 views
1

這是'我的上帝'時刻之一。從逗號分隔值搜索

我們公司以前的程序員已經使用PHP和MySQL留下了一個嚴重編碼的應用程序。

一個例子是,他已經爲每個客戶在MySQL中以逗號分隔的值存儲了選項。整個應用程序是而不是基於OOP的,所以在PHP的500多頁的幾乎每頁中都有重複的引用和查詢。所以現在改變架構和數據存儲邏輯並不容易。

要調整系統六個月的問題,我正在尋找一種方法來執行這些逗號分隔值的搜索。有人對搜索這樣的CSV沒有太大的性能影響有任何想法嗎?我知道這不會是最好的,但至少我可以推動應用程序在新應用程序準備就緒前再過6個月。

感謝您的幫助

+2

該系統可能會或可能不會進行編碼錯誤的,但是這完全是偶然的,以它的面向對象的煩躁。好的代碼不一定需要OOP,OOP也不一定需要好的代碼。 – cletus 2010-01-01 04:06:30

+0

我同意你的觀點。但我並不特別指出面向不良結構的面向對象問題。當然,我已經看到了許多在PHP 5之前構建的良好代碼。但是我掌握的並不是這種情況。我至少會期望處理數據庫查詢的函數。而不是在需要它們的程序的每一點上進行一系列查詢。 – Nirmal 2010-01-01 04:09:18

回答

2

怎麼樣創建正確打破了CSV列到多列(或多個記錄)的表一次作爲批處理過程,然後在舊錶拼湊的更新觸發刷新該用戶的條目(或條目)?然後,您可以在其中編寫體面的查詢,而無需重新編寫setter邏輯。

+0

這是一個好主意!這甚至可以使編寫臨時代碼的工作變得更容易,並且在新表格中仍然保持原子性。 – Nirmal 2010-01-01 06:28:58

0

這裏有一個想法來處理它不改變架構或表示:

<?php 
function checkoption ($user, $option) 
{ 
    global $db; 
    $rs = mysql_query ("select option_field_name from customer where user = '$user'", $db); 
    if ($rs) 
    { 
     // enclose result in commas to remove edge cases for next test 
     $opts = ",," . $rs ['option_field_name'] . ","; 
     return strpos ($opts, ",$option,") != false; 
    } 
    return false; 
} 
?> 

它通過處理與一對額外的周圍的所有引用對邊緣情況衛士查找,option,在該領域的用戶,並逗號。爲了避免零與空問題,一個額外的逗號被添加到數據庫字符串的前面。

0

所以你說你想要一個查詢,返回用戶有特定選項的所有行?

嗯,呃......好吧,這不是很漂亮,但你已經知道這一點,所以:

select * from user_table 
    where concat(',',option_field,',') like "%,option_you_want,%" 

我不能對性能的影響說話 - 它很可能不愉快的,但我認爲你的另一種選擇是把這一行分解成一個單獨的表格,但你說這不是現實可用的。

4

你可以使用FIND_IN_SET檢索符合條件的行:

SELECT * FROM your_table WHERE FIND_IN_SET('value', field_with_comma_sep_values) > 0; 

基本上,FIND_IN_SET返回找到的項目的索引。因此,此查詢會查找所有行,並在逗號分隔值的「集合」中找到匹配詞。

積分:我知道有這樣的事情,但this post是我找到答案和SELECT語句的地方。

+0

謝謝!我嘗試過''val'IN(csv_field)',但它只返回具有一個值的記錄(不知道爲什麼)。 FIND_IN_SET對我來說工作得很好,而且它在20k行的表中速度非常快:) – Peter 2011-09-02 23:36:58

1
$a = '123,456,789'; 
$a_array = explode(",",trim($a)); 
if(in_array('456',$a_array)) 
{ 
    echo 'exist'; 
} else echo 'not exist';