2016-11-21 13 views
0

私のやりたいことは、ドメインのリストを自分のPHPスクリプト($_POST['domains'])に送り、ドメインが似ているテーブルからすべての従業員を取得します。同じデータを持つ2つの別々のSQL文が異なる結果を返しています

ここでは、forループを使用して複数のクエリを実行する例を示します。これは標準ですが、多くの時間がかかります:

$domains = explode(",", $_POST['domains']); 
    $returnObj = new stdClass(); 
    $employees = []; 
    foreach($domains as $domain) { 
     $domainLike = "%".$domain; 
     $query = $conn_databank->prepare("SELECT employee_id FROM employee WHERE domain LIKE ?"); 
     $query->bind_param('s', $domainLike); 
     $query->execute(); 
     $result = $query->get_result(); 
     while($row = $result->fetch_assoc()) { 
      array_push($employees, $row['employee_id']); 
     } 
    } 
    $returnObj->employees = $employees; 
    echo json_encode($returnObj); 

を今、正しい私の周り3900の結果を得るデータの1セット、と。

私がしようとしている他の方法は、より速く実行LIKE ? OR LIKE ?を使用して動的プリペアドステートメントを作成することであるが、(950前後)ほぼ同様に多くの結果が返されません。

$queryString = "SELECT employee_id FROM employee"; 
    $actualQuery = "SELECT employee_id FROM employee"; 
    $bindVariables = []; 
    for($i = 0; $i < count($domains); $i++) { 
     $domainLike = "%".$domains[$i]; 
     if($i == 0) { 
      $queryString .= " WHERE (domain LIKE ?"; 
      $actualQuery .= " WHERE (domain LIKE '".$domainLike."'"; 
     } 
     else { 
      $queryString .= " OR domain LIKE ?"; 
      $actualQuery .= " OR domain LIKE '".$domainLike."'"; 
     } 
     if($i == count($domains) - 1) { 
      $queryString .= ")"; 
      $actualQuery .= ")"; 
     } 
     array_push($bindVariables, $domainLike); 
    } 

    $variables = count(explode("?", $queryString)) - 1; 
    $bindings = []; 
    $bindString = ""; 
    for($i = 0; $i < $variables; $i++) 
     $bindString .= "s"; 
    array_push($bindings, $bindString); 
    foreach($bindVariables as $variable) 
     array_push($bindings, $variable); 
    echo $actualQuery; 
    $query = $conn_databank->prepare($queryString); 
    call_user_func_array(array($query, 'bind_param'), makeValuesReferenced($bindings)); 
    $query->execute(); 
    $result = $query->get_result(); 
    $returnObj = new stdClass(); 

    $employees = []; 
    while($row = $result->fetch_assoc()) { 
     $employee = new stdClass(); 
     $employee->id = $row['employee_id']; 
     array_push($employees, $employee); 
    } 
    $returnObj->employees = $employees; 
    echo json_encode($returnObj); 

$actualQuery変数を無視することそれが適切にクエリを構築しているかどうかを確認することでした。

+0

実際にここで何を求めているのかはっきりしません。 –

答えて

1

あなたの質問は例がないと少し曖昧です。しかし、1つのドメインが複数のlike条件に一致することは明らかです。たとえば、[email protected]は、「mail.com」と「gmail.com」の両方に一致します。

これが問題であるかどうかを判断するのに十分な情報がありません。したがって、1つのアイデアは、ドメインがであることを確認することです。したがって、 "gmail"ではなく "@ gmail.com"で、email like concat('%', $domain)を使用してください。

柔軟性が必要な場合があります(たとえば、「gmail.co.uk」に一致するように)。この場合、ORは重複が含まれていない可能性が高いため、おそらくより正確です。

関連する問題