Изглежда, че искате да създадете изход, който изброява 5-те трамвая, пътуващи от дадена гара до City Square и 5-те трамвая, отиващи от City Square до друга станция. В този случай - не правите никаква връзка (например навреме) между тези две неща - трябва да се присъедините към псевдоколона, row_number() OVER ()
идва на ум:
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);
Във всяка от подзаявките избирате петте интересни реда. Тъй като няма очевидна собственост, можете да JOIN
върху тези два набора редове, трябва да създадете някаква псевдо-колона, която може да служи за тази цел (имате нужда от нещо, към което да се присъедините, или ще получите CROSS JOIN
което води до 5 x 5 реда в изхода). Използване на row_number() OVER () AS rn
прави точно това:създава нова колона с псевдоним rn
който съдържа номера на реда в целия набор от редове (OVER ()
, 5 реда поради LIMIT
клауза). Правите това и в двете подзаявки, за да можете да го използвате като условие за присъединяване:USING (rn)
. Не е необходимо да използвате тази колона в изхода.
Нямате контрол върху това кои 5 часа на трамвая ще бъдат изброени. Ако искате това, трябва да направите нещо като WHERE dt1 > CURRENT_TIME
и ORDER BY dt1
и в двете подзаявки или нещо в тази насока.