2013-08-21 4 views
0

У меня есть два запроса:MySQL - Фильтр на основе результатов другого запроса (отчетливые)

1:

select Firstname, Lastname, ContactID from contacts where account = 'The Beatles'; 

он возвращает

Firstname | Lastname | ContactID 
John  Lennon  Beatle01 
Paul  McCartney Beatle02 
Ringo  Starr  Beatle03 
The   Other1  Beatle04 

Мой второй запрос:

select contacts.lastname, contacts.firstname, 
activities.contactid, activities.completeddate 
from contacts, activities 
where activities.contactid=contacts.contactid 
AND completeddate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY 
AND completeddate < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY 
order by contacts.lastname asc; 

Если есть n на прошлой неделе он вернет что-то вроде:

Firstname | LastName | CompletedDate 
John  Lennon  2013-08-21 13:06 
Paul  McCartney 2013-08-21 15:04 

То, что я действительно хочу запустить, является запросом на исключение. I.E. покажите мне имена пользователей, которые НЕ имели активности на прошлой неделе.

Так запрос 3 возвращает что-то вроде:

Firstname | Lastname | ContactID 
Ringo  Starr  Beatle03 
The   Other1  Beatle04 

Так по существу, мне нужно, чтобы показать всех пользователей в Query1, которые не существуют в запросе два. Я пробовал несколько объединений, innerjoins и т. Д., Но все терпят неудачу.

Может ли кто-нибудь порекомендовать простой способ сделать это?

ответ

2

Для запроса «исключения» подумайте «внешнее соединение». В этом случае left outer join будет делать, но вам необходимо переместить существующие условия в пункт on:

select c.lastname, c.firstname, a.contactid, a.completeddate 
from contacts c left join 
    activities a 
    on a.contactid = c.contactid and 
     completeddate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY and 
     completeddate < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY 
where a.contactid is null 
order by c.lastname asc; 

Заключительная проверка a.contactid проверяет наличие каких-либо матчей - что отчет исключения.

0

Попробуйте это:

select Firstname, Lastname, ContactID 
    from contacts 
where account = 'The Beatles' 
    and contactid not in (
     select contactid 
     from activities 
     where completeddate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY 
      and completeddate < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY 
     ); 
0

Вы можете попробовать это:

select Firstname, Lastname, ContactID 
from contacts 
where contactid not in (
    select contactid 
    from activities 
    where completeddate >= curdate() - INTERVAL DAYOFWEEK(curdate())+6 DAY 
    and completeddate < curdate() - INTERVAL DAYOFWEEK(curdate())-1 DAY 
); 
Смежные вопросы