Я застрял на огромной проблеме, я скажу с моим запросом ниже. Здесь j5
представляет пятницу, а j6
- субботу (с 1 по 7 ... с воскресенья по понедельник).
Как известно, у автобусов разное расписание в зависимости от времени недели. Здесь я отправляюсь в следующие 5 поездок после 25:00:00
на cal (j5)
и / или после 01:00:00
на cal2 (j6)
. Расписание автобусов построено так:
Если сейчас 1 час ночи, то текущее время в автобусе - 25, 2 часа ночи - 26 ... ты понял. Так что, если я хочу отправиться в поездку на сегодня после, скажем, 1 часа ночи, я могу получить только 2-3, так как «автобусный» день скоро закончится. Чтобы решить эту проблему, я хочу добавить следующий отправление со следующего дня (здесь суббота после пятницы). Но следующий день начинается в 00, как и каждый день в нашем мире.
Итак, что я хочу сделать: получить все последующие поездки в пятницу j5
после 25:00:00. Если у меня нет 5, то получите все n отправлений в поездку на субботу после 01:00:00 (с 25:00:00 = 01:00:00).
Пример:
Я отправляюсь в пятницу в 25:16:00, 25:46:00 и 26:16:00. Сейчас 3. Я хочу получить еще 2 рейса на следующий день, так что в конце я получу 5, и это будет как 04:50:00 и 05:15:00.
Таким образом, следующий рейс от X остановка: 25:16:00 (пятница), 25:46:00 (пятница), 26:16:00 (пятница), 04:50:00 (суббота), 05:15:00 (суббота).
У меня проблема с сортировкой обоих результатов из trips.trip_departure
.
Я знаю, что это может быть сложно, мне сложно объяснить, но ... в любом случае. Есть вопрос, я здесь. Большое спасибо заранее!
PS: использование MySQL 5.1.49 и PHP 5.3.8
PS2: я хочу избежать выполнения нескольких запросов в PHP, поэтому я бы хотел сделать это в одном запросе, несмотря ни на что.
SELECT
trips.trip_departure,
trips.trip_arrival,
trips.trip_total_time,
trips.trip_direction
FROM
trips,
trips_assoc,
(
SELECT calendar_regular.cal_regular_id
FROM calendar_regular
WHERE calendar_regular.j5 = 1
) as cal,
(
SELECT calendar_regular.cal_regular_id
FROM calendar_regular
WHERE calendar_regular.j6 = 1
) as cal2
WHERE
trips.trip_id = trips_assoc.trip_id
AND
trips.route_id IN (109)
AND
trips.trip_direction IN (0)
AND
trips.trip_period_start <= "2011-11-25"
AND
trips.trip_period_end >= "2011-11-25"
AND
(
(
cal.cal_regular_id = trips_assoc.calendar_id
AND
trips.trip_departure >= "25:00:00"
)
OR
(
cal2.cal_regular_id = trips_assoc.calendar_id
AND
trips.trip_departure >= "01:00:00"
)
)
ORDER BY
trips.trip_departure ASC
LIMIT
5
РЕДАКТИРОВАТЬ Структура таблицы:
Таблица calendar_regular
j1 означает воскресенье, j7 понедельник и т. Д.).
`cal_regular_id` tinyint(3) unsigned NOT NULL AUTO_INCREMENT,
`j1` tinyint(1) NOT NULL COMMENT 'Lundi',
`j2` tinyint(1) NOT NULL COMMENT 'Mardi',
`j3` tinyint(1) NOT NULL COMMENT 'Mercredi',
`j4` tinyint(1) NOT NULL COMMENT 'Jeudi',
`j5` tinyint(1) NOT NULL COMMENT 'Vendredi',
`j6` tinyint(1) NOT NULL COMMENT 'Samedi',
`j7` tinyint(1) NOT NULL COMMENT 'Dimanche',
PRIMARY KEY (`cal_regular_id`),
KEY `j1` (`j1`),
KEY `j2` (`j2`),
KEY `j3` (`j3`),
KEY `j4` (`j4`),
KEY `j5` (`j5`),
KEY `j6` (`j6`),
KEY `j7` (`j7`)
Данные:
cal_regular_id j1 j2 j3 j4 j5 j6 j7
1 0 0 0 0 1 0 0
2 0 0 0 1 1 0 0
3 1 1 1 1 1 0 0
4 0 0 0 0 0 1 0
5 0 0 0 0 0 0 1
Некоторые автобусы доступны x дней, это таблица, определяющая время недели ... назначенная таблице trip_assoc.
Таблица поездок
`agency_id` smallint(5) unsigned NOT NULL,
`trip_id` binary(16) NOT NULL,
`trip_period_start` date NOT NULL,
`trip_period_end` date NOT NULL,
`trip_direction` tinyint(1) unsigned NOT NULL,
`trip_departure` time NOT NULL,
`trip_arrival` time NOT NULL,
`trip_total_time` mediumint(8) NOT NULL,
`trip_terminus` mediumint(8) NOT NULL,
`route_id` mediumint(8) NOT NULL,
`shape_id` binary(16) NOT NULL,
`block` binary(16) DEFAULT NULL,
KEY `testing` (`route_id`,`trip_direction`),
KEY `trip_departure` (`trip_departure`)
таблица trips_assoc
`agency_id` tinyint(4) NOT NULL,
`trip_id` binary(16) NOT NULL,
`calendar_id` smallint(6) NOT NULL,
KEY `agency_id` (`agency_id`),
KEY `trip_id` (`trip_id`,`calendar_id`)