У меня есть две таблицы. Первая:
Хранит список доступных мест, от первого до последнего. Могут появляться новые места или удаляться текущие, это будет отражено в виде еще одного столбца, пока что опустил, что бы не усложнять запрос.
id, number; Вторая:
Хранит весь список резервов: какой юзер на какую дату забронировал себе опредленное место.
id, Place_number (номер места), Date_reserve (дата), Status(занято), User(пользователь);
Как реализовать запрос, который будет выбирать случайное свободное место на указанную дату?
Возможно я пытаюсь сделать что-то не правильное, но окончательно встал в тупик и буду рад любым советам.
Каждое место резервируется на одну дату, не на интервал? Тогда сравнительно просто.
Делаешь LEFT JOIN, слева - таблица мест, справа таблица резервов, соединяешь по совпадению id места И совпадению даты резерва с назначенной.
Тогда те места, у которых на назначенную дату нет резерва, будут иметь в соответствующих столбцах (типа id юзера) NULL. Тогда если поставить WHERE id юзера IS NULL, останутся только места, свободные на эту дату.
Ну а выбор случайного как обычно: ставишь ORDER BY RANDOM() LIMIT 1
Я бы так к этому подошёл, во всяком случае. Может, есть способ лучше.
Vindicar, что-то пошло не так...
Первая таблица:
id number
Втрорая:
id number user dates bysu
Пишу запрос:
SELECT paking.number FROM `paking`
LEFT JOIN `parking_reserve`
ON parking_reserve.number=paking.number
WHERE parking_reserve.dates != '17.07.22'
order by rand()
limit 1;
Но я получаю только не занятые места из второй таблицы на указанную дату. Вариант с id юзера IS NULL тоже не дают нужного ответа
Starvings, перечитай мой ответ внимательнее. Условие на дату должно быть не в WHERE, а в JOIN ON.
Это принципиально, так как у одного места может быть несколько резервирований на разные даты. Нас интересует только резервирование на конкретную. В этом случае LEFT JOIN отработает так, что при отсутствии резерва на заданную дату строка данного места будет включена в выдачу, но с NULL в полях резерва. И дальше по этому признаку мы сможем отфильтровать такие места.
SELECT paking.number FROM `paking`
LEFT JOIN `parking_reserve`
ON parking_reserve.number=paking.number AND
parking_reserve.dates = '17.07.22'
WHERE parking_reserve.user IS NULL;