2015-01-17 5 views
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 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 ($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 во втором запросе и возвращать только те результаты, в которых эти два не совпадают?

+0

Я спросил подобный вопрос http://stackoverflow.com/a/25106708/2244570 немного по-другому , но вы можете понять и использовать его. – dev

ответ

0

Ok, после долгих проб и ошибок я нашел решение с использованием подзапроса:

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) 
4

Чтобы сравнить два запроса, 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 
+0

Должен быть псевдоним после), но даже при этом он возвращает все строки – dlofrodloh