[英]How to merge these two queries into a comparison query
目前,我有以下两个查询:
"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”表返回联系人,第二个查询从“ company”表返回联系人。 第二个查询还具有仅选择'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进行比较,并且仅返回两个不匹配的结果?
为了比较两个查询, UNION ALL和它的HAVING
子句是键。
此示例应该起作用,并且仅返回重复的行。
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
好的,经过反复试验,我找到了使用子查询的解决方案:
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.