如何解决复杂的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
列。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。