написать эффективную инструкцию MySQL, как представлять в другой форме таблицы

0

(извините, ребята, я думаю, что я никогда не укажу свои требования должным образом)

|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) и где есть те же исходные адресации

  • 0
    Ваш return_price же самое, что return_trip ?
  • 0
    @Michal M: Да, я бы предположил, что return_price - это price из записи с тем же происхождением и назначением, но с типом return trip . @flyclassic: Ты можешь это подтвердить?
Показать ещё 1 комментарий
Теги:

3 ответа

3

Попробуйте это. Я думаю, что это, вероятно, должно работать для ваших требований.

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 может быть опущено, если вы хотите сделать это для всех комбинаций места происхождения и назначения в таблице

  • 0
    спасибо, я добавил свое новое требование, извините за непонятность в первый раз
  • 0
    @flyclassic - обновлен запрос.
2

Вы также можете сделать это с помощью 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, если нет соответствующей цены возврата.

Он также отличает полеты с пунктом назначения и происхождением в обратном направлении; это может быть или не быть тем, что вы хотите.

Кроме того, это даст результаты для всех рейсов. Вы можете дополнительно ограничить ГДЕ, если вам нужно.

  • 0
    Это элегантно. Я в основном использовал «CASE» для аналогичных требований.
  • 0
    спасибо, я добавил свое новое требование, извините за непонятность в первый раз
0

Я бы, вероятно, пошел с 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'

Ещё вопросы

Сообщество Overcoder
Наверх
Меню