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

0

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

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

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 

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

  • 0
    Это было близко к моему ожидаемому ответу, но я возвращаю 4 результата, так как ожидал 2 результата, потому что в этой поездке только два автобуса. --- редактировать ---
  • 5
    Вы можете также добавить ожидаемый результат.
Показать ещё 7 комментариев
Теги:

1 ответ

0
Лучший ответ

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню