Чтобы объединить две строки, используйте CONCAT()
. Чтобы присоединиться к значениям в группе, используйте GROUP_CONCAT
.
SELECT
*,
CONCAT(
route_short_name,
" - ",
GROUP_CONCAT(route_long_name SEPARATOR '/')
) AS route_name
FROM
...
GROUP BY
route_short_name
Было бы вернуть что-то вроде этого:
SHORTNAME - LONGNAME1/LONGNAME2/LONGNAME3
выше будет возвращать только одну строку за route_short_name
. Для того, чтобы получить их все, использовать подзапрос:
SELECT *, (
SELECT CONCAT(
route_short_name,
" - ",
GROUP_CONCAT(route_long_name.b SEPARATOR "/"))
FROM
your_table_name AS your_table_name_inner
WHERE
your_table_name_inner.route_short_name = your_table_name_outer.short_name
GROUP BY
your_table_name.route_short_name
) AS route_name
FROM
your_table_name AS your_table_name_outer
подзапрос в значительной степени так же, как и в первом примере, за исключением того, что она всегда возвращает одну строку в формате SHORTNAME - LONGNAME1/LONGNAME2/etc
. Внешний запрос возвращает все записи, и для каждой записи выполняется подзапрос. Само собой разумеется, что это более тяжелый запрос, чем первый пример.
При ближайшем рассмотрении, его, кажется, что route_short_name
на самом деле очень не имеет отношения к структуре базы данных, в отличие от того, что я предполагал.
Я оставил вышеуказанный ответ, потому что он может помочь кому-то другому.
Если я правильно понимаю, вы хотите присоединиться к двум (не больше, не меньше) записей, где один имеет route_id
окончание с E
и один с O
.
Предполагая следующее:
- Идентификатор всегда 8 символов + ап
E
или O
.
- Всегда есть две записи, которые принадлежат друг другу.
В этом случае:
SELECT
*,
CONCAT(a.route_short_name, ' - ', a.route_long_name, '/', b.route_long_name)
FROM
your_table_name AS a
JOIN
your_table_name AS b
ON
LEFT(a.route_id, 8) = LEFT(b.route_id, 8)
AND
a.route_id != b.route_id
Это делает следующее:
- Возвращает короткое имя, тире, длинное имя 1, слэш, длинное имя 2.
- Регистрация на основе первых 8 символов идентификаторов (
LEFT(str, n)
возвращает первый n символов строки).
- Идентификаторы могут быть несовместимыми (что препятствует соединению с самим собой).
Это может быть довольно медленным (из-за использования LEFT()
), но MySQL может иметь черную магию, которая также может помочь оптимизировать вещи и индексы. Оцените это на своем реальном столе.
вам необходимо проинструктировать нас, как присоединиться к вашим маршрутам вместе, чтобы дать ожидаемые данные. Ваш идентификатор маршрута не совпадает, и вы не предоставляете «маршруты» для своего маршрута, за исключением «E» и «O» в route_id ... –
Не возможно ли с помощью 'group_concat()'? –
@MathieuDumoulin Я не создал эту таблицу ... Проблема в том, что она должна работать так, чтобы она работала со всеми другими таблицами маршрутов от других компаний ... эта проблема. –