Size: a a a

2019 June 05

EB

Eugene Bogun in PHP fwdays
+ Вашем варианте именно одна пересадка, а не две или три. Т.к например есть такой вариант
Kharkiv-Kiev-Lviv-Vancouver 1600
Здесь три пересадки, но у вас не выводятся они
источник

ST

Stepan Tanasiychuk in PHP fwdays
окє. ван момент )
источник

EB

Eugene Bogun in PHP fwdays
Хотелось бы увидеть вариант с реализацией CTE для mysql/mariadb :)
источник

VI

Vadim Isaenko in PHP fwdays
Stepan Tanasiychuk
окє. ван момент )
Решение, ИМХО, в лоб, но самое верное... осталось добавить 2 джойна и второй ордер по конкат значению)
источник

ST

Stepan Tanasiychuk in PHP fwdays
SELECT CONCAT_WS(' - ', fl.from_city, fl.to_city, fl2.to_city, fl3.to_city) AS 'Route',
      (fl.duration + fl2.duration + IFNULL(fl3.duration, 0)) AS 'Duration'
FROM `flights` AS fl
LEFT JOIN flights AS fl2 ON fl.to_city = fl2.from_city
LEFT JOIN flights AS fl3 ON fl2.to_city = fl3.from_city
WHERE (fl.from_city = "Kharkiv"
      AND fl.to_city = "Vancouver")
 OR (fl.from_city = "Kharkiv"
     AND fl2.to_city = "Vancouver")
 OR (fl.from_city = "Kharkiv"
     AND fl3.to_city = "Vancouver")
источник

ST

Stepan Tanasiychuk in PHP fwdays
источник

ST

Stepan Tanasiychuk in PHP fwdays
так?
источник

P

Piter Se in PHP fwdays
with recursive build_path as 
( select flights.from,flights.to,concat(flights.from,',',flights.to) as current_path, 0 as cross_point,duration from flights where 1
union all
select flights.from as `from`, build_path.to as `to`,concat(flights.from,',',build_path.current_path)
as current_path,1+build_path.cross_point as cross_point ,flights.duration+build_path.duration as duration from flights, build_path
where flights.to =build_path.from and `cross_point`<=4 and not find_in_set(flights.from,build_path.current_path)  )
select * from build_path where `from`='kh' and `to`='van'  order by duration  limit 1;
источник

VI

Vadim Isaenko in PHP fwdays
2 ORDER-a: Duration, Route
источник

VI

Vadim Isaenko in PHP fwdays
И LIMIT 1
источник

ST

Stepan Tanasiychuk in PHP fwdays
для чого ліміт?
источник

EB

Eugene Bogun in PHP fwdays
Piter Se
with recursive build_path as 
( select flights.from,flights.to,concat(flights.from,',',flights.to) as current_path, 0 as cross_point,duration from flights where 1
union all
select flights.from as `from`, build_path.to as `to`,concat(flights.from,',',build_path.current_path)
as current_path,1+build_path.cross_point as cross_point ,flights.duration+build_path.duration as duration from flights, build_path
where flights.to =build_path.from and `cross_point`<=4 and not find_in_set(flights.from,build_path.current_path)  )
select * from build_path where `from`='kh' and `to`='van'  order by duration  limit 1;
🔥
источник

ST

Stepan Tanasiychuk in PHP fwdays
пішов я вечеряти )

це рішення коротше ніж ті, які я бачив на конфі і я задоволений, що після 10 років менеджменту ще можу такі задачки вирішувати 😄
источник

ST

Stepan Tanasiychuk in PHP fwdays
рекурсія кльова +1
источник

VI

Vadim Isaenko in PHP fwdays
Stepan Tanasiychuk
для чого ліміт?
Нужен мин по условию или первый в лексикографическом, если таковых несколько.
источник

ST

Stepan Tanasiychuk in PHP fwdays
омг. чуваки ви справжні програмісти )
источник

DK

Dmitry Khaperets in PHP fwdays
для конкретной задачи
SELECT
CONCAT(f1.`from_city`, '-', IF(f1.`from_city` = f2.`from_city`, '', CONCAT(f1.`to_city`, '-')), f2.`to_city`) AS Route,
IF(f1.`from_city` = f2.`from_city`, f1.`duration`, f1.`duration` + f2.`duration`) AS Duration
FROM `flights` f1
LEFT JOIN `flights` f2 ON (f1.`to_city` = f2.`from_city` OR f1.`from_city` = f2.`from_city`)
WHERE f1.`from_city` = 'Kharkiv' AND f2.`to_city` = 'Kyiv'
ORDER BY Duration, Route
LIMIT 1
источник

ST

Stepan Tanasiychuk in PHP fwdays
SELECT CONCAT_WS(' - ', fl.from_city, fl.to_city, fl2.to_city, fl3.to_city) AS 'Route',
      (fl.duration + fl2.duration + IFNULL(fl3.duration, 0)) AS 'Duration'
FROM `flights` AS fl
LEFT JOIN flights AS fl2 ON fl.to_city = fl2.from_city
LEFT JOIN flights AS fl3 ON fl2.to_city = fl3.from_city
WHERE (fl.from_city = "Kharkiv"
      AND fl.to_city = "Vancouver")
 OR (fl.from_city = "Kharkiv"
     AND fl2.to_city = "Vancouver")
 OR (fl.from_city = "Kharkiv"
     AND fl3.to_city = "Vancouver")
ORDER BY Duration, Route
LIMIT 1
источник

ST

Stepan Tanasiychuk in PHP fwdays
Dmitry Khaperets
для конкретной задачи
SELECT
CONCAT(f1.`from_city`, '-', IF(f1.`from_city` = f2.`from_city`, '', CONCAT(f1.`to_city`, '-')), f2.`to_city`) AS Route,
IF(f1.`from_city` = f2.`from_city`, f1.`duration`, f1.`duration` + f2.`duration`) AS Duration
FROM `flights` f1
LEFT JOIN `flights` f2 ON (f1.`to_city` = f2.`from_city` OR f1.`from_city` = f2.`from_city`)
WHERE f1.`from_city` = 'Kharkiv' AND f2.`to_city` = 'Kyiv'
ORDER BY Duration, Route
LIMIT 1
може бути три трансфери )
источник

DC

Denis Chesanovskiy in PHP fwdays
Я так решал

select
 CONCAT_WS(' - ', f1.from_city, f1.to_city, f2.to_city, f3.to_city) as route,
 (f1.duration + IFNULL(f2.duration,0) + IFNULL(f3.duration, 0)) AS duration
from flights f1
left join (select * from flights union select null, null, null) f2 on f1.to_city = f2.from_city or f2.from_city is null
left join (select * from flights union select null, null, null) f3 on f2.to_city = f3.from_city or f3.from_city is null
where f1.from_city = 'Kharkiv'
and (f3.to_city = 'Vancouver'
  or (f3.to_city is null and f2.to_city = 'Vancouver')
  or (f3.to_city is null and f2.to_city is null and f1.to_city = 'Vancouver'))
order by duration asc, route asc
limit 1
источник