Wygląda na to, że chcesz utworzyć wynik, który zawiera listę 5 tramwajów jadących z jednej stacji do Rynku i 5 tramwajów jadących z Rynku do innej stacji. W tym przypadku - nie tworzysz żadnego połączenia (na przykład na czas) między tymi dwiema rzeczami - powinieneś dołączyć na pseudokolumnie, row_number() OVER ()
przychodzi mi na myśl:
SELECT '$name' AS name1, w1.time1, 'City Square - arrival' AS name2, w1.time2,
'City Square - departure' AS name3, w2.time3, '$name2' AS name4, w2.time4
FROM (
SELECT dt1.time AS time1, dt2.time AS time2, row_number() OVER () AS rn
FROM departure_times AS dt1
JOIN departure_times AS dt2 USING (tram_id)
WHERE dt1.name = '$name' AND dt2.name = 'CitySquare'
LIMIT 5) w1
JOIN (
SELECT dt1.time AS time3, dt2.time AS time4, row_number() OVER () AS rn
FROM departure_times AS dt1
JOIN departure_times AS dt2 USING (tram_id)
WHERE dt1.name = 'CitySquare' AND dt2.name = '$name2'
LIMIT 5) w2 USING (rn);
W każdym z podzapytań wybierasz pięć interesujących Cię wierszy. Ponieważ nie ma widocznej właściwości, możesz JOIN
te dwa zestawy wierszy, musisz utworzyć jakąś pseudokolumnę, która może służyć do tego celu (potrzebujesz czegoś do przyłączenia lub otrzymasz CROSS JOIN
co daje w wyniku 5 x 5 wierszy). Korzystanie z row_number() OVER () AS rn
robi właśnie to:tworzy nową kolumnę z aliasem rn
który zawiera numer wiersza w całym zestawie wierszy (OVER ()
, 5 wierszy ze względu na LIMIT
klauzula). Robisz to w obu podzapytaniach, więc możesz użyć tego jako warunku przyłączenia:USING (rn)
. Nie musisz używać tej kolumny w danych wyjściowych.
Nie masz kontroli nad tym, które 5 razy tramwaje zostaną wymienione. Jeśli chcesz, powinieneś zrobić coś takiego jak WHERE dt1 > CURRENT_TIME
i ORDER BY dt1
w obu podzapytaniach lub coś podobnego.