2016-08-17 57 views
0

我正在做一个搜索,试图寻找具有指定公司名称和职位的联系人作为WHERE参数。有时候不会与指定职位和公司有任何联系。当我使用公司名称集时,我怎样才能找出哪些结果未找到?这实在是很难解释......如何查找在SQL中找不到哪些数据记录?

一个例子SQL语句可能是

SELECT * 
    FROM contacts 
WHERE company_name IN ('bbc', 'yahoo', 'some company') 
    AND contact_position 
    LIKE 'manager' 

我想知道哪些公司没有为这个头衔有任何接触,如果是有道理的?

我到目前为止做出这一点,但我相信有这样做的更好的方法:

$contacts_no_inv = Contact::find_query(" 
    SELECT * 
     FROM contacts 
    WHERE {$data_search} 
     AND contact_position 
     LIKE '%{$_POST['job_title']}%' 
"); 

if ($contacts_no_inv) { 
    foreach ($contacts_no_inv as $contact_no_inv) { 
     $companies_found[] = $contact_no_inv->company_name; 
     if (!in_array($contact_no_inv->contact_id, $idArr)) { 
      $filtered_no_inv[] = $contact_no_inv; 
     } 
    } 
} 

$companies_found = array_unique($companies_found); 
$companies_found = array_filter($companies_found); 

foreach ($_POST['query'] as $query) { 
    if (!in_array(strtolower($query), array_map('strtolower', $companies_found))) { 
     if (count(explode(' ', strtolower($query))) > 1) { 
      foreach (explode(' ', $query) as $query_element) { 
       if (!in_array(strtolower($query_element), array_map('strtolower', $companies_found))) { 
        $companies_found[] = $query; 
       } 
      } 
     } 

     $companies_not_found[] = $query; 
    } 
} 
+0

这可以完全用你的SQL语句完成,没有所有额外的PHP代码(更不用说它会更快!)。发布您的表格结构将帮助我们帮助您编写查询来完成您的任务。 – mituw16

回答

0

翻转周围的WHERE条件找东西不符合现有的条件。像这样

SELECT * FROM contacts WHERE company_name NOT IN ('bbc', 'yahoo', 'some company') OR contact_position NOT LIKE 'manager'") 
+0

我仍然需要访问被发现的公司 - 这是否会排除访问这些记录? –

+0

你想同时使用两个吗?如果是这样,WHERE的目的是什么?这似乎更像是你想要得到所有的行... –

+0

有像400,000行。我只想要找到用户提交的公司名称和工作职位的行 - 但是,我也想显示在数据库中找到的公司。我发布的代码确实有效 - 我只是认为可能有更好的方法来使用SQL。 –

0

正如Gareth指出的那样,一种方法是切换逻辑。另一种是只使用NOT

SELECT c.* 
FROM contacts c 
WHERE NOT (company_name IN ('bbc', 'yahoo', 'some company') AND 
      contact_position LIKE 'manager' 
     ); 

注意的一点是:这两种方法排除NULL值。因此,如果company_namecontact_positionNULL,那么这两种方法都不会返回该行(NULL比较返回NULL,将其视为false)。