You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

公交预订系统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关联两个子查询,确保我们获取的是同一辆公交的对应行程数据,避免交叉匹配

执行这个查询后,会得到符合预期的结果:

BusNametripFromtripToDepartureArrival
Sprinter10110401:00:0002:30:00
VVIP Bus10110402:00:0003:15:00

注:你预期输出里VVIP Bus的Departure写的是2:30:00,但根据表中数据,它的出发时间是02:00:00(ID=52的记录),上述结果是完全匹配表中数据的,如果是笔误可以自行调整筛选条件~

内容的提问来源于stack exchange,提问作者Mohammed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:31:18