2016-07-25 38 views
-1

如何最好地搜索僅包含用戶搜索標籤的項目,無論是具有所有標籤還是隻包含一些標籤?如何在MySQL中使用PHP和JS搜索特定標籤

因此,例如:

item | param 
----------------- 
1  | a 
1  | b 
1  | c 

2  | b 
2  | c 
2  | d 

3  | c 
3  | d 
3  | e 

4  | d 
4  | e 
4  | f 

項目1具有A,B,C;項目2有b,c,d;第3項有c,d,e;項目4具有d,e,f

用戶輸入到帶有參數a,c,d,e,g的搜索欄中; 1和2有b和4有f,它們在用戶參數之外。所以只有第3項,因爲它只有c,d,e而沒有別的,這3個參數屬於用戶的參數。它沒有a或g,但沒關係。

我只能想到一些方法來做到這一點。我能想到的最好的方法是:

1:在另一個表中,說出物品的主表,存儲這個物品具有的標籤的數量。

2:循環查詢整個表,使用參數如WHERE (param=$user_para[$key])一次參數。每次參數匹配時,項目標識符都會被添加到數組中。

3:循環結束後,算法會計算一個項目ID出現在數組中的次數,並與主表中的變量數進行比較。如果它小於存儲的數字(所以用戶想要的標籤不在該項目中),那麼數組將刪除所有該項目ID並檢查下一個。

我覺得這樣還是很糟糕的。什麼是更好的解決方案?

我把JS/AJAX放在標籤中,因爲我想知道在前端可以做些什麼,而不是在後端加上更多的壓力。

+0

請說明。如果用戶搜索'c,d,e,f,g,h',那麼具有'c,d,k'的項目是否匹配? – BeetleJuice

+0

不,因爲k不在用戶的搜索參數 – J13t0u

+0

好吧,我明白了。我的方法與你有些不同,但應該有效。 – BeetleJuice

回答

1

1.將您從用戶獲得的參數拆分爲數組並構建WHERE部分SQL查詢。假設用戶想要PARAMS a,b

$input = $_POST['params']; // eg: a,b 
$params = explode(',', $input); // eg: [a,b] 
$qry_params =[]; //holds the processed parameters 

//todo: here you want to escape each input param to prevent SQL injection 

foreach($params as $param) $qry_params[] = "params like '%$param%'";  

//$where will be: where params like '%a%' or params like '%b%' 
$where = " where ".implode(" or ",$qry_params); 

2.使用SQL查詢,這將使你的所有PARAMS按項目分組。需要注意的是$where在底部

select * from(
    select item, GROUP_CONCAT(param) as params 
    from tbl 
    group by item 
) t 
where params like '%a%' or params like '%b%' 

See the result set

item | params 
------------- 
1 | a,b,c,d 
2 | e,d,c,b 

3.現在你有兩個具有PARAMS要求的用戶的至少一個所有項目。最後一步是遍歷結果,擺脫那些參數的用戶從來沒有要求

的假設全部返還被放在一個$rows陣列

$matches = []; // final result 
foreach($rows as $row){ 
    $dbParams = explode(',', $row['params']); eg: [a,b,c,d] for item 1 

    //array_diff returns array of values in $dbParams not found in $params 
    //if there is no such value (db has no extras the user doesn't want) 
    //add the current row to matches. 
    if(!array_diff($dbParams,$params)) $matches[] = $row; 
} 

此時$matches數據庫記錄是集以前的結果集滿足您的要求。

+0

似乎比我的簡單。當我回家時,我會試試看。我需要更多地使用查詢命令,我不知道有像group_concat這樣的功能。 – J13t0u

+0

@ J13t0u它比你建議的要簡單得多:它不依賴於第二個表,更重要的是它不依賴於在循環中執行多個查詢(這也使得這個速度快得多)。 SQL非常強大;如果有一種方法可以通過正確的查詢來獲得準確的結果,我不會感到驚訝。我還沒有那個技能水平。 – BeetleJuice

+0

我問了另一個問題在這裏http://stackoverflow.com/questions/38576706/how-to-find-out-how-many-times-a-mysql-comparison-query-returns-true-and-false/ 去先讓你的方法工作,然後嘗試他的查詢。 – J13t0u