【问题标题】:How to merge these two queries into a comparison query如何将这两个查询合并为一个比较查询
【发布时间】:2015-03-15 23:39:05
【问题描述】:

目前我有这两个查询:

"SELECT company.id, company.name, 
        contact.firstname, contact.lastname, 
        contact.email, contact.id AS contactid
   from ecampaign_lookup
   LEFT JOIN company ON ecampaign_lookup.companyid=company.id 
   LEFT JOIN contact ON ecampaign_lookup.contactid=contact.id
  WHERE ecampaign_lookup.campaignid=".$tid;

还有:

"SELECT company.id, company.name, 
         contact.firstname, contact.lastname, 
         contact.email, contact.id AS contactid
   from ecampaign_lookup
   LEFT JOIN company ON ecampaign_lookup.companyid=company.id 
   LEFT JOIN contact ON contact.companyid=company.id
  WHERE ecampaign_lookup.campaignid=".$tid." 
    AND contact.defaultcontact=1";

不同之处在于第一个查询从“ecampaign_lookup”表返回联系人,第二个查询从“公司”表返回联系人。第二个查询还要求只选择 'contact.defaultcontact=1' 的联系人,因为每个公司有很多联系人,但每个 ecampaign_lookup 只有一个联系人。

目前我分别运行这两个查询,然后使用 for 循环来比较结果,如果一个查询返回的结果少于或多于另一个,则很容易出错:

        for ($x=0;$x<count($query1_result);$x++){
                if ($query1_result[$x]['contactid']!=$query2_result[$x]['contactid']){
                     echo $query1_result[$x]['firstname']." has been replaced by ".
                     $query2_result[$x]['firstname'];   
                }
        }   

如何将两个查询合并在一起以将 ecampaign_lookup.contactid 与第二个查询中的 contact.id 进行比较,并且只返回两者不匹配的结果?

【问题讨论】:

标签: php mysql


【解决方案1】:

要比较两个查询,UNION ALLHAVING 子句是关键。

这个例子应该可以工作并且只返回重复的行。

SELECT id, name, firstname, lastname, email, contactid
FROM
(
  SELECT company.id, company.name, 
     contact.firstname, contact.lastname, 
     contact.email, contact.id AS contactid
  FROM ecampaign_lookup
  LEFT JOIN company ON ecampaign_lookup.companyid=company.id 
  LEFT JOIN contact ON ecampaign_lookup.contactid=contact.id
  WHERE ecampaign_lookup.campaignid=:tid

  UNION ALL

  SELECT cp2.id, cp2.name, 
     ct2.firstname, ct2.lastname, 
     ct2.email, ct2.id AS contactid
  FROM ecampaign_lookup ecl2
  LEFT JOIN company cp2 ON ecl2.companyid=cp2.id 
  LEFT JOIN contact ct2 ON ct2.companyid=cp2.id
  WHERE ecl2.campaignid=:tid AND ct2.defaultcontact=1
)
GROUP BY id, name, firstname, lastname, email, contactid
HAVING count(*) >= 1

【讨论】:

  • 在 ) 之后需要有一个别名,但即使这样它也会返回所有行
【解决方案2】:

好的,经过反复试验,我找到了使用子查询的解决方案:

 SELECT company.id,
       company.NAME,
       contact.firstname,
       contact.lastname,
       contact.email,
       contact.id AS contactid
FROM   ecampaign_lookup
       LEFT JOIN company
              ON ecampaign_lookup.companyid = company.id
       LEFT JOIN contact
              ON contact.companyid = company.id
WHERE  ecampaign_lookup.campaignid = :tid
       AND contact.defaultcontact = 1
       AND contact.id NOT IN (SELECT contact.id AS contactid
                              FROM   ecampaign_lookup
                                     LEFT JOIN company
                                            ON
                                     ecampaign_lookup.companyid = company.id
                                     LEFT JOIN contact
                                            ON
                                     ecampaign_lookup.contactid = contact.id
                                     WHERE  ecampaign_lookup.campaignid = :tid)  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-28
    • 1970-01-01
    • 2022-06-13
    • 1970-01-01
    相关资源
    最近更新 更多