Как сформулировать SELECT?

У меня есть две таблицы. Таблица занятий

CREATE TABLE IF NOT EXISTS `ja_yoga`.`lessons` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `date` DATE NOT NULL,
  PRIMARY KEY (`id`)
)
ENGINE = InnoDB

и таблица планируемых посещений этих занятий

CREATE TABLE IF NOT EXISTS `ja_yoga`.`future_lessons` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `lesson` INT UNSIGNED NOT NULL,
  `user` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`id`),
  CONSTRAINT `lesson`
    FOREIGN KEY (`lesson`)
    REFERENCES `ja_yoga`.`lessons` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `users`
    FOREIGN KEY (`user`)
    REFERENCES `ja_yoga`.`users` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE,
)
ENGINE = InnoDB

Для простоты будем считать, что на каждое отдельное занятие может быть записано неограниченное число разных людей.

Мне нужно найти дни, на которые можно перенести занятие юзера с future_lessons.user=N (и на которые у него пока не запланированы занятия). Для этого я должен, как я понимаю, сформулировать SELECT, который бы выбирал из таблицы lessons все записи, которые бы соответствовали такому условию: в таблице future_lessons НЕ ДОЛЖНО быть записей, у которых future_lessons.lesson=lessons.id и при этом future_lessons.user=N. Как мне сформулировать такой запрос?

Maxim 27.05.2020 в 12:24

Ответы (2)


SELECT date
FROM ja_yoga.lessons l
LEFT JOIN ja_yoga.future_lessons fl
ON l.id = fl.lesson
WHERE fl.user != 'someValue'

надеюсь что я праивльно понял то, что ты ниже описывал...

Bogdan 27.05.2020 в 15:15

SELECT date
FROM ja_yoga.lessons
WHERE id NOT IN (SELECT lesson FROM ja_yoga.future_lessons WHERE user = 'someValue')

для тех кто будет рассказывать о джойнах)

Bogdan 27.05.2020 в 15:19

Классный пример без джойнов, мне уже много раз пригодился. Спасибо!

ivan.tretiakov 19.09.2021 в 18:47

Добавить новый ответ