MySQL Join Где ассоциация не существует - PullRequest
0 голосов
/ 20 октября 2011

Я получаю идентификаторы клиентов для клиентов, у которых есть встречи в 2011 году

SELECT customers.id
FROM customers 
INNER JOIN sites ON customers.id = sites.customer_id
INNER JOIN appointments ON appointments.site_id = sites.id
WHERE YEAR(appointments.day) = 2011   

Я ищу клиентов, у которых нет назначений в 2011 году. Запутался, как это сделать.

Ответы [ 4 ]

3 голосов
/ 20 октября 2011

Пара способов:

SELECT
    C.id
FROM
    Customers C
WHERE
    NOT EXISTS (
        SELECT *
        FROM
            Sites S
        INNER JOIN Appointments A ON
            A.site_id = S.id AND
            YEAR(A.day) = 2011
        WHERE
            S.customer_id = C.id
    )

или

SELECT DISTINCT
    C.id
FROM
    Customers C
INNER JOIN Sites S ON
    S.customer_id = C.id
LEFT OUTER JOIN Appointments A ON
    A.site_id = S.id AND
    YEAR(A.day) = 2011
WHERE
    A.id IS NULL
1 голос
/ 20 октября 2011

... ГДЕ НЕ ГОД (назначений.день) = 2011

0 голосов
/ 21 октября 2011
 SELECT customers.id
 FROM customers, sites, appointments
 WHERE (customers.id = sites.customer_id and appointments.id = sites.id) 
 and  YEAR(appointments.day) <> 2011

Пожалуйста, проверьте ваш конкретный сервер базы данных на наличие «<>», которое «не равно».

0 голосов
/ 20 октября 2011

Должен был сделать ответ вместо редактирования. Не очень хочу искать NULL из-за масштабирования.

SELECT id
FROM customers 
WHERE NOT EXISTS (SELECT * FROM sites 
                      INNER JOIN appointments ON appointments.site_id = sites.id
                  WHERE sites.customer_id = customers.id AND YEAR(appointments.day) = 2011)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...