Som det ser ud, vil du oprette et output, der viser de 5 sporvogne, der går fra en station til City Square og 5 sporvogne, der går fra City Square til en anden station. I dette tilfælde - du laver ingen forbindelse (for eksempel til tiden) mellem disse to ting - skal du slutte dig til en pseudo-kolonne, row_number() OVER ()
kommer til at tænke på:
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);
I hver af underforespørgslerne vælger du de fem rækker af interesse. Da der ikke er nogen synlig egenskab, kan du JOIN
disse to sæt rækker på, skal du oprette en eller anden pseudo-kolonne, der kan tjene det formål (du har brug for noget at deltage på, ellers får du en CROSS JOIN
resulterer i 5 x 5 rækker i outputtet). Brug af row_number() OVER () AS rn
gør netop det:den opretter en ny kolonne med alias rn
som indeholder rækkenummeret over hele rækkesættet (OVER ()
, 5 rækker på grund af LIMIT
klausul). Du gør dette i begge underforespørgsler, så du kan bruge det som join-betingelsen:USING (rn)
. Du behøver ikke bruge denne kolonne i outputtet.
Du har ingen kontrol over, hvilke 5 sporvognstider der vil blive opført. Hvis du ønsker det, bør du gøre noget som WHERE dt1 > CURRENT_TIME
og ORDER BY dt1
i begge underforespørgsler eller noget i den retning.