MySQL Множественный выбор из одной таблицы

Mohammed спросил: 28 апреля 2018 в 09:33 в: mysql

Я создаю систему резервирования автобусов. Я пытаюсь запросить шину на основе выбранной поездки. Я имею в таблицах "Отправление и прибытие" для хранения времени. Мне нужно запросить "Отправление" и "Прибытие".

Ниже приведена моя схема таблиц

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 

Это пример того, что я хочу, чтобы мой результат был. Спасибо снова

1 ответ

Есть решение
Nick ответил: 28 апреля 2018 в 09:58

Проблема с вашим запросом заключается в том, что вы используете 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
Mohammed ответил: 29 апреля 2018 в 11:29
спасибо @ Ник, ты спас мой день
Nick ответил: 29 апреля 2018 в 11:41
Не волнуйтесь. Рад, что смог помочь.