À première vue, vous souhaitez créer une sortie qui répertorie les 5 tramways allant d'une station à City Square et les 5 tramways allant de City Square à une autre station. Dans ce cas - vous ne faites aucun lien (par exemple, à temps) entre ces deux choses - vous devez joindre sur une pseudo-colonne, row_number() OVER ()
me vient à l'esprit :
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);
Dans chacune des sous-requêtes, vous sélectionnez les cinq lignes qui vous intéressent. Puisqu'il n'y a pas de propriété apparente, vous pouvez JOIN
ces deux ensembles de lignes, vous devez créer une pseudo-colonne qui peut servir à cette fin (vous avez besoin de quelque chose pour vous joindre ou vous obtiendrez un CROSS JOIN
résultant en 5 x 5 lignes dans la sortie). Utilisation de row_number() OVER () AS rn
fait exactement cela :il crée une nouvelle colonne avec l'alias rn
qui contient le numéro de ligne sur tout l'ensemble de lignes (OVER ()
, 5 lignes à cause de la LIMIT
clause). Vous faites cela dans les deux sous-requêtes afin de pouvoir l'utiliser comme condition de jointure :USING (rn)
. Vous n'êtes pas obligé d'utiliser cette colonne dans la sortie.
Vous n'avez aucun contrôle sur les 5 heures de tram qui seront répertoriées. Si vous voulez cela, vous devriez faire quelque chose comme WHERE dt1 > CURRENT_TIME
et ORDER BY dt1
dans les deux sous-requêtes, ou quelque chose dans ce sens.