(извините, ребята, я думаю, что я никогда не укажу свои требования должным образом)
|origin |destination |flight_type |price| |melbourne|sydney |one way |100 | |melbourne|sydney |one way |120 | |melbourne|sydney |one way |150 | |melbourne|sydney |return trip |250 | |melbourne|sydney |return trip |300 | |melbourne|sydney |return trip |350 |
как написать наиболее эффективный один запрос mysql, чтобы получить самую низкую цену для каждого способа, результат таблицы, как показано ниже:
|origin |destination |oneway_price(lowest) |return_trip_price(lowest)| |melbourne |sydney |100 |250 | |
Я думаю о том, чтобы найти самый низкий тариф для одного из способов (группа по происхождению, dest, тип полета и flight_type = один путь), и левые присоединяются к себе с наименьшим тарифом для возвращения (группа по происхождению, dest, полет type и flight_type = return) и где есть те же исходные адресации
Попробуйте это. Я думаю, что это, вероятно, должно работать для ваших требований.
EDIT: Обновлено на основе обновленного вопроса
SELECT
origin,
destination,
MIN(CASE flight_type WHEN 'one way' THEN price END) as 'oneway_price',
MIN(CASE flight_type WHEN 'return trip' THEN price END) as 'return_price'
FROM table
WHERE origin = 'melbourne'
AND destination = 'sydney'
GROUP BY origin, destination
Примечание. Предложение WHERE может быть опущено, если вы хотите сделать это для всех комбинаций места происхождения и назначения в таблице
Вы также можете сделать это с помощью JOIN:
select
f1.origin, f1.destination, f1.price as price_oneway,f2.price as price_return
from flights f1
left join flights f2
on f1.origin=f2.origin and f1.destination=f2.destination and f2.flight_type='return trip'
where f1.flight_type='one way'
Обратите внимание, что это приведет только к результатам для комбинаций (источник, пункт назначения), которые имеют одностороннюю цену; он даст NULL
для price_return
, если нет соответствующей цены возврата.
Он также отличает полеты с пунктом назначения и происхождением в обратном направлении; это может быть или не быть тем, что вы хотите.
Кроме того, это даст результаты для всех рейсов. Вы можете дополнительно ограничить ГДЕ, если вам нужно.
Я бы, вероятно, пошел с SUBQUERY, как это.
SELECT
origin,
destination,
price as oneway_price,
(SELECT price FROM my_table WHERE origin = 'sydney' AND destination = 'melbourne') as return_price
FROM
my_table
WHERE
origin = 'melbourne' AND
destination = 'sydney'
Это должно быть довольно просто, если вы передадите названия городов в качестве переменных.
Это тоже может работать, сначала нужно проверить:
SELECT
t.origin,
t.destination,
t.price as oneway_price,
(SELECT price FROM my_table WHERE origin = t.destination AND destination = t.origin) as return_price
FROM
my_table t
WHERE
origin = 'melbourne' AND
destination = 'sydney'
return_price
же самое, чтоreturn_trip
?return_price
- этоprice
из записи с тем же происхождением и назначением, но с типомreturn trip
. @flyclassic: Ты можешь это подтвердить?