Я строю систему бронирования автобусов. Я пытаюсь запросить шину на основе выбранной поездки. У меня есть в таблицах "Отправление и прибытие" для хранения времени. Мне нужно запросить Отправление и Прибытие.
Ниже приведена моя таблица.
CREATE TABLE 'bus_details' (
'ID' int(11) NOT NULL,
'Route' varchar(60) NOT NULL,
'RouteCode' int(11) NOT NULL,
'BusCode' int(11) NOT NULL,
'CityCode' int(11) NOT NULL,
'City' varchar(20) NOT NULL,
'Departure' time DEFAULT NULL,
'Arrival' time DEFAULT NULL,
'FromCityCode' int(11) NOT NULL,
'ToCityCode' int(11) NOT NULL,
'BusName' varchar(30) NOT NULL,
'sValid' int(11) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
INSERT INTO 'bus_details' ('ID', 'Route', 'RouteCode', 'BusCode', 'CityCode', 'City', 'Departure', 'Arrival', 'FromCityCode', 'ToCityCode', 'BusName', 'sValid') VALUES
(48, 'Accra Mall - Papaye', 10001, 1001, 101, 'Accra Mall', '01:00:00', NULL, 101, 101, 'Sprinter', 1),
(49, 'Accra Mall - Papaye', 10001, 1001, 102, 'Flower Pot', '00:30:00', '01:15:00', 101, 102, 'Sprinter', 0),
(50, 'Accra Mall - Papaye', 10001, 1001, 103, 'Palace', '02:00:00', '00:45:00', 102, 103, 'Sprinter', 0),
(51, 'Accra Mall - Papaye', 10001, 1001, 104, 'Papaye', NULL, '02:30:00', 103, 104, 'Sprinter', 1),
(52, 'Accra Mall - Papaye', 10001, 1003, 101, 'Accra Mall', '02:00:00', NULL, 101, 101, 'VVIP Bus', 1),
(53, 'Accra Mall - Papaye', 10001, 1003, 102, 'Flower Pot', '02:30:00', '02:15:00', 101, 102, 'VVIP Bus', 0),
(54, 'Accra Mall - Papaye', 10001, 1003, 103, 'Palace', '03:00:00', '02:45:00', 102, 103, 'VVIP Bus', 0),
(55, 'Accra Mall - Papaye', 10001, 1003, 104, 'Papaye', NULL, '03:15:00', 103, 104, 'VVIP Bus', 1);
ALTER TABLE 'bus_details'
ADD PRIMARY KEY ('ID');
Я попытался с
SELECT DISTINCT(t1.BusCode), t1.BusName, t1.CityCode, t1.FromCityCode, t2.ToCityCode, t1.Departure, t2.Arrival
FROM
(SELECT BusName, BusCode, CityCode, FromCityCode, ToCityCode, Departure From bus_details Where CityCode IN(101) AND FromCityCode IN(101) Group By BusCode) As t1,
(SELECT BusName, BusCode, CityCode, FromCityCode, ToCityCode, Arrival From bus_details Where CityCode IN(104) AND ToCityCode IN(104) Group By BusCode) As t2
Что было близко к моему ожидаемому ответу, но я возвращаю 4 результата, как я ожидаю, потому что в этой поездке только две автобусы.
В четырех результатах два являются правильными, а два - нет.
Пожалуйста, вы можете помочь мне с правильным запросом для этой операции.
заранее спасибо
**Expected Output**
BusName | tripFrom | tripTo | Departure | Arrival
Sprinter 101 104 1:00:00 2:30:00
VVIP Bus 101 104 2:30:00 3:15:00
Это образец того, что я хочу, чтобы мой результат был. еще раз спасибо
Проблема с вашим запросом заключается в том, что вы используете JOIN
без каких-либо условий, поэтому он создает кросс-продукт из двух маршрутов шины x 2 маршрута шины = 4 результата. Если бы у вас было 3 маршрута, у вас было бы 9 результатов. Если бы вы включили t2.BusName
в свой SELECT, вы бы увидели все случаи, когда оно было отличным от t1.BusName
. Вам нужно ограничить результат, добавив условие, которое гарантирует, что шина одинакова на обоих маршрутах, т. t1.BusCode = t2.BusCode
(или t1.BusName = t2.BusName
)
SELECT t1.BusName, t1.FromCityCode AS tripFrom, t2.ToCityCode AS tripTo, t1.Departure, t2.Arrival
FROM
(SELECT BusName, BusCode, CityCode, FromCityCode, ToCityCode, Departure
FROM bus_details
WHERE CityCode IN(101) AND FromCityCode IN(101)
GROUP BY BusCode) As t1
JOIN
(SELECT BusName, BusCode, CityCode, FromCityCode, ToCityCode, Arrival
FROM bus_details
WHERE CityCode IN(104) AND ToCityCode IN(104)
GROUP BY BusCode) As t2
ON t1.BusCode = t2.BusCode
Выход (демо):
BusName tripFrom tripTo Departure Arrival
Sprinter 101 104 01:00:00 02:30:00
VVIP Bus 101 104 02:00:00 03:15:00