Как правильно составить sql запрос?

Всем привет!
Есть 2 таблицы
cars
60cb1011cf24b184750313.png
CREATE TABLE `cars` (
  `regnum` varchar(10) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
  `brand` varchar(20) NOT NULL,
  `model` varchar(20) NOT NULL,
  `type` tinyint(1) UNSIGNED NOT NULL,
  `color` varchar(14) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
  `fuel` tinyint(1) UNSIGNED NOT NULL,
  `year` int(4) UNSIGNED NOT NULL,
  `mileage` int(10) UNSIGNED NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
rental
60cb109605165356673055.png
CREATE TABLE `rental` (
  `id` int(5) NOT NULL,
  `car` varchar(10) CHARACTER SET ascii COLLATE ascii_bin NOT NULL,
  `user_id` int(5) UNSIGNED NOT NULL,
  `price` decimal(19,2) NOT NULL,
  `pick_up_location` varchar(20) NOT NULL,
  `drop_out_location` varchar(20) NOT NULL,
  `start_date` date NOT NULL,
  `end_date` date NOT NULL,
  `remark` text NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Задача состоит в том что нужно получить
  1. Сейчас свободные
  2. Занятые
  3. Зарезервированы (start_date > CURRENT_DATE())

Я питался и у меня даже вроде бы получилось получать зарезервированные
SELECT DISTINCT c.* FROM cars c join rental r on c.regnum = r.car where r.start_date > CURRENT_DATE()

Но остальное работать не хочет((
Кто знает как сделать?
  • Вопрос задан
  • 105 просмотров
Решения вопроса 1
rozhnev
@rozhnev Куратор тега MySQL
Fullstack programmer, DBA, медленно, дорого
Свободные машины:
select   * 
from cars 
where not exists (
    select 1 
    from rental 
    where 
      rental.car = cars.regnum 
      and CURRENT_DATE() between start_date and end_date
  );


Занятые машины
select   * 
from cars 
where  exists (
    select 1 
    from rental 
    where 
      rental.car = cars.regnum 
      and CURRENT_DATE() between start_date and end_date
  );


Зарезервированы машины
select   * 
from cars 
where  exists (
    select 1 
    from rental 
    where 
      rental.car = cars.regnum 
      and start_date > CURRENT_DATE()
  );
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
Володимир Паламар, Во первых по структуре нормальной формы, каждая запись должна иметь уникальный идентификатор, коим номер машины являться не может, как и например цвет машины.
Во вторых - делать связку по полю варчар - не очень хорошее решение, индексы по ним как минимум серьезно больше, а поиск медленнее. Молчу что на номерах как минимум могут быть русские буквы, не считая каких-то других символов нелатинских, а у вас кодировка поля аски. Остальные поля по уму тоже надо бы вывести в связанные таблицы, типа цвет, брэнд и прочее, но это уже к этому конкретному вопросу не относится, да и от задачи зависит.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы