复杂的SQL查询,需要根据时间限制通过计数排序

问题描述

| 大家好,我在这里有以下三个表格。
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
它可以正常工作,但执行时间非常短-再考虑一下,我的机场表具有30''000多个条目,并且trips表是可变的。 我只是从countrys表中获取国家/地区的名称-如果我改为在sql中排除加入countrys表,而是从索引为ID和值的数组中检索国家/地区名称,那会更好是国家名称?     

解决方法

我不确定为什么要使用左联接。如果每次旅行都有一个机场,每个机场都有一个国家,并且内部联接将为您提供准确的结果。 我会这样做:
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。 另外,我建议您将\“ Date \”列重命名为不会与保留的SQL字冲突的名称。我通常使用\“ DateCreated \”或\“ DateOfTravel \”或类似的名称。 如果我做出任何错误的假设,请告诉我,然后我可以重新编写。 编辑: 对于索引,请在要查找的字段上创建索引。换句话说,主键(应始终被索引),外键,在这种情况下,日期列似乎是另一个重要索引。但是,如果您打算使用\“ Airport Name \”进行搜索,请在此处添加索引。我想您会看到前进的方向,等等。     ,
airpoirt(countryid,id)
trips(airportid)
上的索引似乎是最重要的。 代替
count(f.id)
尝试
count(f.airportid)
,这样MySQL不必检查
trips.id
列。     

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...