MySQL выбирает запись из одной таблицы, которой нет в другой

У меня есть 2 таблицы:

TABLE customer_service_provider
==================================
id   | customer | service_provider
==================================
1    | 1        | 1
2    | 1        | 2
3    | 1        | 3
4    | 2        | 1
5    | 2        | 2
6    | 3        | 1
7    | 4        | 1
8    | 4        | 2
9    | 4        | 3
===================================

TABLE service_provider
======================
id     | Name
======================
1      | Company1
2      | Company2
3      | Company3
======================

Мне нужно получить информацию из таблицы customer_service_provider (поля customer и service_provider), которая service_provider не существует в таблице customer_service_provider, но существует в таблице service_provider.

Результат должен выглядеть так:

customer   |  service_provider
==============================
2          | 3
3          | 2
3          | 3
==============================

РЕШЕНО:

SELECT
    DISTINCT sp.id,
    csp.customer
FROM
    service_provider sp,
    customer_service_provider csp
WHERE
    sp.id NOT IN( SELECT csp2.service_provider 
                  FROM customer_service_provider csp2 
                  WHERE csp2.customer = csp.customer)

person Artūras    schedule 18.05.2012    source источник
comment
Я не понимаю. Вы хотите, что именно?   -  person juergen d    schedule 18.05.2012
comment
у вас есть service_provider 1, 2, 3 в customer_service_provider... поэтому по вашему требованию у вас не должно быть вывода no   -  person Andreas Wong    schedule 18.05.2012
comment
Не размещайте гигантский раздел РЕШЕНО. Либо примите приведенный ниже ответ, который решил вашу проблему, либо, если вы сделали это самостоятельно, опубликуйте ответ и отметьте его как принятый ответ.   -  person Cylindric    schedule 21.05.2012


Ответы (2)


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

SELECT c.customer, s.id
FROM customer_service_provider c, service_provider s
WHERE NOT EXISTS (
    SELECT * FROM customer_service_provider c2
    WHERE c2.customer = c.customer AND c2.service_provider = s.id
)

Или, более эффективно:

SELECT c.customer, s.id
FROM customer_service_provider c, service_provider s
LEFT OUTER JOIN customer_service_provider c2 ON c2.customer = c.customer AND c2.service_provider = s.id
WHERE c2.id IS NULL

Я не проверял это, дайте мне знать.

person lorenzo-s    schedule 18.05.2012
comment
Запрос выполняется вечно и просто зависает без результата. В таблицах C около 16 тысяч записей, в таблице S всего 10, поэтому возникает очень большой цикл. - person Artūras; 18.05.2012
comment
Хорошо, я не учел размер таблицы. Я пытаюсь переписать более эффективную версию. - person lorenzo-s; 18.05.2012
comment
извините за такую ​​задержку, но это не работает: [SQL] ВЫБЕРИТЕ c.customer, s.id FROM customer_service_provider c, service_provider s LEFT OUTER JOIN customer_service_provider c2 ON c2.customer = c.customer AND c2.service_provider = s.id WHERE c2 .id IS NULL [Err] 1054 - Неизвестный столбец 'c.customer' в предложении on. Интересно, что столбец существует, но выдает такую ​​ошибку, я пытался переписать его несколькими способами, но это не помогло. помощь. - person Artūras; 21.05.2012
comment
первый запрос работает отлично, просто нужно добавить DISTINCT, и САМОЕ важное, о чем я забыл, это добавить индекс в таблицу, большое спасибо! - person Artūras; 21.05.2012

Я полагаю, у вас также есть стол с клиентами. В этом случае используйте следующее:

select customer.id, service_provider.id 
from customer, service_provider 
left join customer_service_provider on customer.id=customer_service_provider.customer and service_provider.id=customer_service_provider.service_provider
where customer_service_provider.id IS NULL;

По сути, верните все комбинации клиентов и поставщиков услуг. Сделайте LEFT JOIN этого в таблице customer_service_provider; и сохраняйте только те вещи, для которых нет соответствующей записи.

person Eljakim    schedule 18.05.2012
comment
Следующий запрос: SELECT add_customers.id, service_provider.id FROM add_customers, service_provider LEFT JOIN customer_service_provider ON add_customers.id=customer_service_provider.customer AND service_provider.id=customer_service_provider.service_provider WHERE customer_service_provider.id IS NULL Возвращает эту ошибку: 1054 – Неизвестный столбец "add_customers.id" в предложении "on" - person Artūras; 21.05.2012
comment
Привет Артурас, как называется поле id в вашей таблице add_customers?? - person Eljakim; 21.05.2012