2016-11-28 81 views
1

從我的申請,我送的用戶列表,我想搜索他們訂閱組:我有我的數據庫中許多不同的團體與許多不同的PHP代碼搜索多個單詞VARCHAR

$selectedUsers = ["John", "Carlos", "Anna", "Julia"] 

用戶 他們每個人:

$football = ["**John**" ,"**Carlos**" ,"Daniel" ,"Rob" ,"Frank" ,"Bob"] 

$cooking = ["**John**" , "**Anna**" , "**Julia**" , "Claudia" , "Rob" , "Adriana"] 

$startups = ["**John**", "**Carlos**", "**Anna**", "**Julia**", "Rob", "Adriana"] 

我想有輸出與selectedUsers量集團在它的排序列表:

$returnArray[0] = $startups //4 users inside group 
$returnArray[1] = $cooking //3 users inside group 
$returnArray[2] = $football //2 users inside group 

這裏是我到目前爲止的代碼,但我使用的循環是基於我存儲在GROUP_ID,我想改變這種狀況:

<?php 
    //fetch groups with users 

    $returnValue = array(); 
    $groupUsersNumber = 0; 

    $selectedUsers = htmlentities($_REQUEST["selectedUsers"]); 
    $lastGroupID = htmlentities($_REQUEST["lastGroupID"]); //remove 

    if($lastGroupID == ""){ 
     $lastGroupID = getLastGroupID(); 
     $lastGroupID = $lastGroupID + 1; 
    } 

    if($selectedUsers == ""){ 
     //return all groups ordered by ID desc 

     $group = getGroupWithID($lastGroupID); 

    } else{ 

     $usersArray = explode(', ', $selectedUsers); 
     $foundGroup = false; 
     while($foundGroup == false){ 

      $group = getGroupWithID($lastGroupID); 

      $fetchedGroupUsers = explode(', ', $group["users"]); 
      for($i = 0; $i < count($usersArray); $i++){ 
       if(in_array($usersArray[$i], $fetchedGroupUsers)){ 
        $foundGroup = true; 
        break; 
       } else{ 
        $lastGroupID = $group["group_id"]; 
       } 
      } 
     } 
    } 

    for($i = 0; $i < count($usersArray); $i++){ 
     if(in_array($usersArray[$i], $fetchedGroupUsers)){ 
      $groupUsersNumber = $groupUsersNumber + 1; 
     } 
    } 

    if(empty($group)) 
    { 
     $returnValue["status"]="403"; 
     $returnValue["message"]="No more groups with that users."; 
     echo json_encode($returnValue); 
     return; 
    } else{ 

     $returnValue=$group; 
     $returnValue["groupUsersNumber"]=$groupUsersNumber; 
    } 

    echo json_encode($returnValue); 
?> 

是否有任何其他的方式有更好/更有效的方式來搜索我的數據庫?不勝感激!

+1

我沒有發現任何與數據庫相關的代碼。 – arkascha

+2

你如何將它們存儲在數據庫中?如果一個正確的規範化數據庫,那麼在php – Kickstart

+0

中進行任何處理之前,如果你有一個數據庫,那麼在SQL中執行此操作可能會更容易,請「描述」它。因此,用戶和組之間的關係(理想情況下多對多)將幫助我們揭示更好的解決方案。 – marmeladze

回答

1

看來你的數據庫沒有正常化。規範化的數據庫可能是更有效的方式。不要將用戶存儲在描述性的varchar中。相反建立一個多對多的關係。

除此之外,PHP的FilterIterator類是你的東西。它可以重複使用,並且在遍歷數組時效率更高。

這是一個簡短的例子。

class NameFilterIterator extends FilterIterator { 

    protected $filter = null; 

    public function __construct(Iterator $iterator, $filter) { 
     parent::__construct($iterator); 
     $this->filter = $filter; 
    } 

    public function accept() { 
     $current = $this->getInnerIterator()->current(); 

     if (strpos($current, $this->filter) !== false) { 
      return true; 
     } 

     return false; 
    } 
} 

// Usage 
$aUsers = [ 'John', 'Carlos', 'Anna', 'Julia' ]; 
$oFootball = new ArrayIterator(["**John**" ,"**Carlos**" ,"Daniel" ,"Rob" ,"Frank" ,"Bob"]); 

foreach ($aUsers as $sUser) { 
    $oFilter = new NameFilterIterator($oFootball, $sUser); 
    foreach ($oFilter as $sName) { 
     var_dump($sName); // outputs: John, Carlos 
    } 
} 

FilterIterator對象的內部內存使用方式效率更高。

1

你似乎在混淆php和mysql,並且最好重新設計你的數據庫。

然而,作爲一個基本的想法,你可以大致做你想要的MySQL。這不是很好,但效率不高,但是像這樣:

SELECT a.group_description , 
     GROUP_CONCAT(b.wanted_name) 
FROM some_table a 
LEFT OUTER JOIN 
(
    SELECT "John" AS wanted_name UNION SELECT "Carlos" UNION SELECT "Anna" UNION SELECT "Julia" 
) b 
ON FIND_IN_SET(b.wanted_name, a.group_users) 
GROUP BY a. group_description