Utifrån det så vill du skapa en utgång som listar de 5 spårvagnarna som går från en station till City Square och 5 spårvagnar som går från City Square till någon annan station. I det här fallet - du gör ingen koppling (till exempel i tid) mellan dessa två saker - bör du gå med på en pseudo-kolumn, row_number() OVER ()
kommer att tänka 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 var och en av underfrågorna väljer du de fem raderna av intresse. Eftersom det inte finns någon synlig egenskap kan du JOIN
dessa två uppsättningar av rader på, måste du skapa någon pseudo-kolumn som kan tjäna det syftet (du behöver något att gå med på annars får du en CROSS JOIN
vilket resulterar i 5 x 5 rader i utgången). Använder row_number() OVER () AS rn
gör just det:den skapar en ny kolumn med alias rn
som innehåller radnumret över hela raduppsättningen (OVER ()
, 5 rader på grund av LIMIT
klausul). Du gör detta i båda underfrågorna så att du kan använda det som kopplingsvillkor:USING (rn)
. Du behöver inte använda den här kolumnen i utdata.
Du har ingen kontroll över vilka 5 spårvagnstider som kommer att listas. Om du vill det bör du göra något som WHERE dt1 > CURRENT_TIME
och ORDER BY dt1
i båda underfrågorna, eller något i den stilen.