Сложный запрос SQL, необходимо отсортировать по количеству на основе временных ограничений - PullRequest
0 голосов
/ 13 апреля 2011

Привет, ребята. У меня есть следующие три таблицы.

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 записей, а таблица поездок является переменной.

Я просто беру название страны из таблицы стран - было бы лучше, если бы я вместо этого исключил присоединение к таблице стран в sql и вместо этого получил название страны из массива, индексом которого является идентификатор а значениями являются названия стран?

Ответы [ 2 ]

2 голосов
/ 13 апреля 2011

Я не уверен, почему вы используете левые соединения.Если в каждой поездке есть аэропорт, а в каждом аэропорту есть страна, и внутреннее объединение даст вам точные результаты.

Я бы сделал следующее:

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» или что-то в этом роде.

Если я сделал какие-то неверные предположения, дайте мне знать, и я могу переписать это.1017 * Для индексов создайте их на полях, по которым вы будете искать.Другими словами, первичные ключи (которые всегда должны быть проиндексированы), внешние ключи, и в этом случае похоже, что столбец Date будет другим важным индексом.Однако, если вы планируете поиск по названию аэропорта, добавьте туда индекс.Я думаю, вы видите, куда это идет и т. Д.

1 голос
/ 13 апреля 2011

Индексы airpoirt(countryid, id) и trips(airportid) кажутся наиболее важными.

Вместо count(f.id) попробуйте count(f.airportid), поэтому MySQL не нужно проверять столбец trips.id.

...