Часть 4 из 16
В базе появились первые события. Если показать всё расписание сразу, организатору придётся вручную искать нужную дату и статус. Мы научимся поручать этот отбор MySQL: зададим условия в WHERE, выберем порядок через ORDER BY и ограничим выдачу.
На примере субботней программы разберём временные границы и особое значение NULL — это подготовит нас к билетам, у которых ещё нет отметки о проходе. В конце будет короткая практика по составлению фильтра.
Отбор по статусу
SELECT event_id,name,starts_at,status
FROM events
WHERE status IN ('open','planned')
ORDER BY starts_at
LIMIT 20;
IN короче цепочки OR. LIMIT ограничивает число строк. Без ORDER BY MySQL не обещает стабильный порядок.
День как временной интервал
SELECT name,starts_at
FROM events
WHERE starts_at >= '2026-10-31 00:00:00'
AND starts_at < '2026-11-01 00:00:00';
Укажите включённое начало и исключённое начало следующего дня. Так не приходится угадывать последнюю долю секунды суток; такой фильтр подходит и для индекса по времени.
NULL — отдельный случай
У билета без отметки прохода checked_in_at будет NULL. Проверяйте его через IS NULL, не через = NULL: отсутствие значения нельзя сравнивать как обычный текст или число.
SELECT sale_id,ticket_code FROM ticket_sales WHERE checked_in_at IS NULL;
Таблицу продаж добавим дальше. Пока формулируйте запрос как вопрос: какие поля нужны, откуда взять, какие условия и в каком порядке? В следующей части вычислим длительность события.
Пошаговая отладка WHERE
Если запрос вернул пустой результат, это не всегда означает поломку. Сначала выполните SELECT DISTINCT status FROM events;, чтобы увидеть реальные статусы. Возможно, вы сохранили только planned, а фильтруете по open. Затем временно уберите условие по дате, проверьте наличие строк, и добавьте его обратно.
Так вы найдёте условие, которое исключило записи.
Сравнения дат включают нижнюю границу в нашем примере, но не верхнюю: событие ровно в полночь 1 ноября уже не попадёт в субботу. Это желаемое поведение. Если нужно показать также статус «finished», добавьте его в список IN, а не ослабляйте остальные условия.
Проверка знаний: перепишите запрос так, чтобы показать три самых поздних события после 30 октября. Используйте нижнюю границу, сортировку по starts_at DESC и LIMIT 3. Затем объясните себе, почему LIMIT применяется после сортировки. В следующей части научимся вычислять длительность события и формировать человекочитаемый статус.
Комбинируем условия без неожиданностей
К условиям можно добавить OR, когда подходят разные варианты. Например, «событие открыто или уже завершено» записывается как status = 'open' OR status = 'finished'. Если смешать AND и OR, используйте скобки, чтобы явно показать порядок:
SELECT name, status, starts_at
FROM events
WHERE (status = 'open' OR status = 'planned')
AND starts_at >= '2026-10-31 00:00:00'
ORDER BY starts_at;
Без скобок логика может читаться иначе, чем вы ожидаете, поскольку AND связывается теснее, чем OR. Для проверки мысленно составьте таблицу истинности для каждой строки или сначала запустите отдельные SELECT по каждой ветке.
Оператор NOT исключает условие, а BETWEEN включает обе границы. Для временных интервалов часто удобнее полуоткрытый вариант из основного примера, потому что он не пропускает значения с долями секунды. Так можно подобрать фильтр под смысл задачи, а не просто сократить количество символов.
Короткая памятка по фильтрам
| Условие | Что проверяет | Пример |
|---|---|---|
| IN | Одно из перечисленных значений | status IN ('open','planned') |
| AND | Оба условия сразу | status = 'open' AND starts_at > ... |
| IS NULL | Значение ещё не задано | checked_in_at IS NULL |
| LIKE | Поиск по шаблону текста | name LIKE 'Ночная%' |
Скобки помогают явно задать смысл, если вы соединяете AND и OR.
← Предыдущая статья: INSERT и SELECT в MySQL: добавляем первые данные
Следующая статья: Вычисления и даты в SQL: готовим расписание фестиваля →
0
15