如何进行不包含所有参数的行的SQL查询

时间:2019-04-18 20:07:43

标签: php mysql sql

我有一个搜索框,我为用户提供了他们要搜索的关键字。提交后,我将输入框中的单词(如果有多个单词)拆分为一个数组,并对每个单词进行查询。使用SQL,我可以获得具有至少一个值的结果,问题是我只想获得在一列或另一列中至少具有所有参数的行。

public function employeeSearchAction()
    {
        if ($this->user_permissions < 1) {
            return 0;
        }
        // split search string into array based on spaces
        if ($this->data != '') {
            $searchParams = explode(' ', trim($this->data));
            // get any rows with any one of these values in them
            foreach ($searchParams as $s) {
                $this->db->orWhere('user_firstname', '%'.$s.'%', 'like');
                $this->db->orWhere('user_lastname', '%'.$s.'%', 'like');
                $this->db->orWhere('user_email1', '%'.$s.'%', 'like');
                $this->db->orWhere('user_phn_1', '%'.$s.'%', 'like');
                $this->db->orWhere('user_phn_2', '%'.$s.'%', 'like');
                $this->db->orWhere('user_phn_3', '%'.$s.'%', 'like');
                // $this->db->orWhere('user_address1', '%'.$s.'%', 'like');
                $this->db->orWhere('user_position', '%'.$s.'%', 'like');
                $this->db->orWhere('user_type', '%'.$s.'%', 'like');
                $this->db->orWhere('user_division', '%'.$s.'%', 'like');
                // $this->db->orWhere('user_position', $s);
                // $this->db->orWhere('user_type', $s);
                // $this->db->orWhere('user_division', $s);
            }
            $this->db->having('owner_id', $this->owner_id);
            $binaryArray = array_fill(0, sizeof($searchParams), 0);
            $results = $this->db->get('tblusers');
            $filtered = [];
            // filter rows to ensure that all rows have every parameter
            foreach ($results as $r) {
                $binaryArray = array_fill(0, sizeof($searchParams), 0);
                foreach ($binaryArray as $key=>$b) {
                    if (strpos(strtolower($r['user_firstname']), strtolower($searchParams[$key])) !== false ||
                  strpos(strtolower($r['user_lastname']), strtolower($searchParams[$key])) !== false ||
                  strpos($r['user_email1'], strtolower($searchParams[$key])) !== false ||
                  strpos($r['user_phn_1'], strtolower($searchParams[$key])) !== false ||
                  strpos($r['user_phn_2'], strtolower($searchParams[$key])) !== false ||
                  strpos($r['user_phn_3'], strtolower($searchParams[$key])) !== false ||
                  strpos(strtolower($r['user_position']), strtolower($searchParams[$key])) !== false ||
                  strpos(strtolower($r['user_type']), strtolower($searchParams[$key])) !== false ||
                  strpos(strtolower($r['user_division']), strtolower($searchParams[$key])) !== false
                  // strpos($r['user_address1'], strtolower($searchParams[$key])) !== false
                ) {
                        $binaryArray[$key] = 1;
                    }
                }
                if (!in_array(0, $binaryArray)) {
                    $filtered[] = $r;
                }
            }
        } else {
            $this->db->where('owner_id', $this->owner_id);
            $filtered = $this->db->get('tblusers');
        }
        foreach ($filtered as $r) {
            $user_phn_1 = $r['user_phn_1'] == '' ? 'N/A' : '<a href="tel:+1'.$r['user_phn_1'].'">'.preg_replace("/[^0-9]/", "", $r['user_phn_1']).'</a>';
            $user_phn_2 = $r['user_phn_2'] == '' ? 'N/A' : '<a href="tel:+1'.$r['user_phn_2'].'">'.$r['user_phn_2'].'</a>';
            $user_position = $r['user_position'] == '' ? 'N/A' : $r['user_position'];
            $user_type = $r['user_type'] == '' ? 'N/A' : $r['user_type'];
            $user_division = $r['user_division'] == '' ? 'N/A' : $r['user_division'];
            $user_email1 = $r['user_email1'] == '' ? 'N/A' : '<a href="mailto:'.$r['user_email1'].'">'.$r['user_email1'].'</a>';
            $user_address1 = $r['user_address1'] == '' ? 'N/A' : '<a href="https://maps.google.com/maps?q='.$r['user_address1'].'">'.$r['user_address1'].'</a>';
            $user_firstname = $r['user_firstname'] == '' ? 'N/A' : $r['user_firstname'];
            $user_lastname = $r['user_lastname'] == '' ? 'N/A' : $r['user_lastname'];
            $r['is_ready'] != 1 ? $user_firstname .=  ' <i title="Employee is not ready to work." class="orange fas fa-exclamation-triangle"></i>' : '';
            echo "
            <div class='search-form_row-container'>
              <div class='col-xs-6 col-sm-6'>
                 <i class='fas fa-file-signature'>
                 <span class='results-text results-text--name'>$user_lastname $user_firstname</span>
                 </i>
              </div>
              <div class='col-xs-6 col-sm-6'>
               <i class='fas fa-phone'>
                <span class='results-text results-text--phone'>{$user_phn_1}</span>
               </i>
              </div>
              <div class='col-xs-6 col-sm-6'>
                <a href='/includes/sql/store/users/curr_user.php?id={$r['user_id']}&goto=/users/user_profile_main.php'>
                 <i class='fas fa-link'>
                 <span class='results-text results-text--edit'>View Profile</span>
                 </i>
                </a>
              </div>
              <div class='col-xs-6 col-sm-6'>
                 <i class='fas fa-suitcase-rolling'>
                 <span class='results-text results-text--position'>$user_position</span>
                 </i>
              </div>
              <div class='col-xs-6 col-sm-6'>
                 <i class='fas fa-map-marker-alt'>
                 <span class='results-text results-text--type'>$user_type</span>
                 </i>
              </div>
              <div class='col-xs-6 col-sm-6'>
                 <i class='fas fa-i-cursor'></i>
                 <span class='results-text results-text--division'>$user_division</span>
                 </i>
              </div>
          </div>
        ";
        }
    }

我应该拥有的功能是什么,但我不禁注意到它是如此的丑陋和低效。查看代码,您将知道我没有使用原始查询,而是使用了https://github.com/ThingEngineer/PHP-MySQLi-Database-Class Mysqlidb。如果您希望以这种格式放弃短语,那很好,该库可以使用原始查询。任何帮助表示赞赏。我只希望只检索包含所有参数的记录,而不是检索至少包含一个参数的记录,然后使用PHP过滤掉它们。

1 个答案:

答案 0 :(得分:0)

您需要运行一个查询,以获取所有用户的数据。对于每个用户,您需要检查该用户的数据是否包含每个关键字。如果用户数据包含所有关键字,则可以将用户包括在搜索结果中。

因此,您需要具有嵌套循环。外循环检查每个用户。内部循环检查用户数据中的每个关键字。如果用户数据包含所有关键字,则将用户包括在搜索结果中。如果用户数据中没有关键字之一,则中断内部循环并检查下一个用户。