公交预订系统MySQL同表查询问题:获取指定行程的发车与到达时间
解决公交预订系统的行程时间查询问题
你遇到的核心问题是原来的查询用了无关联的笛卡尔积,导致两个子查询的结果交叉匹配,所以得到了4条冗余结果。咱们来修正这个查询,精准获取每辆公交的对应行程时间:
首先先确认下你的表结构(方便参考):
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`);
你原来的查询没有关联两个子查询的BusCode,所以会产生2×2的笛卡尔积。正确的做法是用JOIN通过BusCode(或同时加BusName)关联两个子查询,确保匹配的是同一辆公交的出发和到达信息:
SELECT t1.BusName, t1.FromCityCode AS tripFrom, t2.ToCityCode AS tripTo, t1.Departure, t2.Arrival FROM (SELECT BusName, BusCode, FromCityCode, Departure FROM bus_details WHERE CityCode = 101 AND FromCityCode = 101 AND sValid = 1) AS t1 INNER JOIN (SELECT BusName, BusCode, ToCityCode, Arrival FROM bus_details WHERE CityCode = 104 AND ToCityCode = 104 AND sValid = 1) AS t2 ON t1.BusCode = t2.BusCode;
逻辑说明:
- 子查询
t1:筛选出**出发城市Accra Mall(CityCode=101)**的有效公交(sValid=1)的出发时间信息 - 子查询
t2:筛选出**到达城市Papaye(CityCode=104)**的有效公交的到达时间信息 - 通过
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 |
注:你预期输出里VVIP Bus的Departure写的是2:30:00,但根据表中数据,它的出发时间是02:00:00(ID=52的记录),上述结果是完全匹配表中数据的,如果是笔误可以自行调整筛选条件~
内容的提问来源于stack exchange,提问作者Mohammed
相关产品推荐
相关产品推荐

