0

大家好,我这里有以下三张表。

COUNTRIES
ID | Name | Details

Airports
ID | NAME | CountryID

Trips
ID | AirportID | Date

我必须检索显示以下内容的列表:

AirportID | AIrport Name | Country Name | Number of Trips Made Between Date1 and Date2

我需要这样做才能真正有效,我需要设置什么样的索引以及如何在这里制定 SQL 查询?我将使用 PHP 来显示这个。请注意,我需要能够根据出行次数进行排序。

编辑 ==

哎呀忘了提我的sql:

我尝试了以下方法:

SELECT `c`.*, `t`.`country` AS `country_name`, COUNT(f.`id`) AS `num_trips` FROM `airports` AS `c`
 LEFT JOIN `countries` AS `t` ON  t.`id` = c.`country_id` 
 LEFT JOIN `trips` AS `f` ON f.`airportid` = c.`id` GROUP BY `c`.`id` ORDER BY `num_flights` ASC LIMIT 10

它可以工作,但需要很长时间才能执行 - 再加上考虑到我的 airports 表有超过 30'000 个条目,并且 trips 表是可变的。

我只是从国家表中获取国家/地区的名称 - 如果我在 sql 中排除加入国家/地区表,而是从索引为 ID 和值的数组中检索国家/地区名称会更好国家名称?

4

2 回答 2

2

我不确定你为什么使用左连接。如果每次旅行都有一个机场,每个机场都有一个国家,那么内部连接将为您提供准确的结果。

我会这样做:

select a.ID as AirportID, a.Name as AirportName, c.Name as CountryName, count(t.id) as NumTrips from Trips t inner join Airports a on t.AirportID = a.ID inner join Countries c on a.CountryID = c.ID where t.Date >= @StartDate and t.Date <= @EndDate group by AirportID, AirportName, CountryName order by NumTrips limit 10

将 @StartDate 和 @EndDate 替换为您的适当值。

不知道你在寻找什么结果,但我希望你想要最多的旅行。在这种情况下,您会想要“按 NumTrips desc 排序”。这将首先显示最高值,特别是因为您将其限制为 10。

另外,我建议您将“日期”列重命名为不会与保留的 SQL 字冲突的内容。我通常使用“DateCreated”或“DateOfTravel”或类似的东西。

如果我做了任何糟糕的假设,请告诉我,我可以重新编写。

编辑:

对于索引,在您将要查找的字段上创建它们。换句话说,主键(应该始终被索引)、外键,在这种情况下,看起来 Date 列将是另一个重要的索引。但是,如果您打算按“机场名称”搜索,请在此处添加索引。我想你知道这会走向何方,等等。

于 2011-04-13T07:06:46.660 回答
1

索引似乎是最重要的airpoirt(countryid, id)trips(airportid)

而不是count(f.id)try count(f.airportid),所以 MySQL 不必检查trips.id列。

于 2011-04-13T06:41:47.407 回答