如何找到SQL中没有找到的数据记录?


How do I find which data records weren't found for in SQL?

我正在进行搜索,试图查找具有指定公司名称和职位名称的联系人作为WHERE参数。有时不会有任何与指定的职位和公司的联系。当我使用公司名称集时,我如何发现没有找到哪些结果?这真的很难解释…

一个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;
     }
}

翻转您的WHERE条件,找到与您现有条件不匹配的东西。这样的

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

一种方法是切换逻辑,正如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)。