SELECT journey.id, TIME_FORMAT(ADDTIME(journey.departure, SEC_TO_TIME(SUM(l1.elapsed))), '%H:%i') AS departure, null AS arrival
FROM journey
INNER JOIN journey_day ON journey_day.journey = journey.code
INNER JOIN pattern ON pattern.code = journey.pattern
INNER JOIN link l1 ON l1.section = pattern.section AND l1.stop = "370023139"
INNER JOIN link l2 ON l2.section = pattern.section AND l2.id <= l1.id
WHERE journey.service = "11-252-_-y08-1" AND journey_day.day = 1 AND journey.code NOT IN (SELECT journey
FROM journey_non_operation
WHERE "2015-03-01" BETWEEN date_start AND date_end) AND pattern.direction = "outbound"
GROUP BY journey.id
UNION ALL
SELECT journey.id, null AS departure, TIME_FORMAT(ADDTIME(journey.departure, SEC_TO_TIME(SUM(l1.elapsed))), '%H:%i') AS arrival
FROM journey
INNER JOIN journey_day ON journey_day.journey = journey.code
INNER JOIN pattern ON pattern.code = journey.pattern
INNER JOIN link l1 ON l1.section = pattern.section AND l1.stop = "1000DEHS7812"
INNER JOIN link l2 ON l2.section = pattern.section AND l2.id <= l1.id
WHERE journey.service = "11-252-_-y08-1" AND journey_day.day = 1 AND journey.code NOT IN (SELECT journey
FROM journey_non_operation
WHERE "2015-03-01" BETWEEN date_start AND date_end) AND pattern.direction = "outbound"
GROUP BY journey.id
Above is two queries with their results merged by a UNION ALL clause. You will notice that the queries return different columns, one called 'departure' and one called 'arrival'. To get the UNION
to work with the different column names I have to give the other column NULL
so that it doesn't ignore it and not include it in the query.
My issue is I have results that looks like this:
id | departure | arrival
1 asd NULL
2 asd NULL
3 asd NULL
4 asd NULL
5 NULL efg
6 NULL efg
7 NULL efg
8 NULL efg
How can I merge the rows so that asd
and efg
match up based on the ID?
Desired result:
id | departure | arrival
1 asd efg
2 asd efg
3 asd efg
4 asd efg
Just apply an aggregate function (min/max) to your result set. As nulls are not included in the aggregate you will just get the combined results:
select id, min(departure), min(arrival)
from (your query) as q
group by id
I am not sure why did you try to build union.
Try this way:
SELECT journey.id,
TIME_FORMAT(ADDTIME(journey.departure, SEC_TO_TIME(SUM(l1.elapsed))), '%H:%i') AS departure,
TIME_FORMAT(ADDTIME(journey.departure, SEC_TO_TIME(SUM(l2.elapsed))), '%H:%i') AS arrival
FROM journey
INNER JOIN pattern
ON pattern.code = journey.pattern
INNER JOIN link l1
ON l1.section = pattern.section
AND l1.stop = "370023139"
INNER JOIN link l2
ON l2.section = pattern.section
AND l2.stop = "1000DEHS7812"
AND l2.id <= l1.id
WHERE journey.service = "11-252-_-y08-1"
AND journey_day.day = 1
AND journey.code NOT IN (
SELECT journey
FROM journey_non_operation
WHERE "2015-03-01" BETWEEN date_start AND date_end)
AND pattern.direction = "outbound"
GROUP BY journey.id
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.