@symnoob

SQL запрос, как осуществить выборку данных одним махом?

Всем Привет,

пытаюсь отселектировать данные одним запросом, но не могу врубится где моя ошибка, к Примеру 2 Таблицы 1:н

Автолюбители и Автомобили, нужно выбрать всех Автолюбителей у которых нет ни одного Мерседеса или БМВ

Проблема моя именно в том что у Автолюбителя могут быть несколько Автомобилей: Мерседес, Ауди (вот этот уже должен отсеется).

А у другого Ауди и Волга (этот должен попасть в список)

Вот что я без успешно пробовал:

SELECT p.id FROM peoples p LEFT JOIN cars c on p.id = c.peoples_id WHERE c.desc NOT IN ('Mercedes', 'BMW');
  • Вопрос задан
  • 92 просмотра
Пригласить эксперта
Ответы на вопрос 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
SELECT `id` 
  FROM `peoples`
  WHERE `id` NOT IN (
    SELECT `peoples_id`
      FROM `cars`
      WHERE `desc` IN ('Mercedes', 'BMW')
  )

или
SELECT `p`.`id` 
  FROM `peoples` AS `p`
  LEFT JOIN `cars` AS `c`
    ON `c`.`peoples_id` = `p`.`id`
      AND `c`.`desc` IN ('Mercedes', 'BMW')
  WHERE `c`.`peoples_id` IS NULL
Ответ написан
twobomb
@twobomb
SELECT p.id FROM peoples as p WHERE NOT (SELECT COUNT(*) FROM cars as c WHERE c.peoples_id = p.id AND c.desc IN ('Mercedes', 'BMW'));
Ответ написан
Комментировать
@Akela_wolf
Extreme Programmer
SELECT p.* FROM peoples p --выбираем людей, для которых
WHERE NOT EXISTS ( --не существует
  SELECT 1 FROM cars c --машины
  WHERE c.peoples_id = p.id --принадлежаший этому человеку
  AND c.desc IN ('Mercedes', 'BMW') --и которая мерседес или бмв
)


Заменив NOT EXISTS на EXISTS можно получить обратный список - тех у кого есть мерс или бмв.
В случае поиска людей у которых НЕТ - полный аналог приведенного в ответе Rsa97 варианта с LEFT JOIN. Но в случае поиска людей у которых ЕСТЬ - вариант с LEFT JOIN может давать дублирующиеся строки, вариант с EXISTS всегда возвращает не более одной строки для каждого человека.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы