如果我有一个包含多个站点的公共汽车表,并且每个站点记录都有到达时间,那么如何在最早的站点时间检索和订购公共汽车?

 _______    ________
| Buses |  | Stops  |
|-------|  |--------|
| id    |  | id     |
| name  |  | bus_id |
 -------   | time   |
            --------

我可以通过以下查询来完成:
SELECT DISTINCT sub.id, sub.name
FROM
(SELECT buses.*, stops.time
 FROM buses
 INNER JOIN stops ON stops.bus_id = buses.id
 ORDER BY stops.time) AS sub;

…但这样做的缺点是必须执行2个查询,并且必须在SELECT DISTINCT子句中指定总线中的所有字段。如果公车表发生变化,那就特别烦人了。
我想做的是:
SELECT DISTINCT buses.*
FROM buses
INNER JOIN stops ON stops.bus_id = buses.id
ORDER BY stops.time;

……然而,为了得到DISTINCT buses.*,我还必须包括stops.time,这给了我不同停车时间的重复公共汽车。
做这个查询最好的方法是什么?

最佳答案

您可以做的一件事是将内部查询放入ORDER BY。这将保持外部查询“干净”,因为它将只从总线中选择。这样就不需要返回任何其他字段。

SELECT buses.*
FROM buses
ORDER BY (
  SELECT MIN(stops.time) FROM stops WHERE stops.bus_id = buses.id
)

09-04 09:08