2011-12-29 4 views
0

У меня проблема. У меня есть данные в таблице, которые выглядят так:Создайте одну строку из других строк

route_id route_short_name route_long_name 

AOUT1112E 12     Direction Pont-Viau 
AOUT1112O 12     Direction Métro Cartier 
JANV1212E 12     Direction Pont-Viau 
JANV1212O 12     Direction Métro Cartier 
JRAN1212E 12     Direction Pont-Viau 
JRAN1212O 12     Direction Métro Cartier 

мне нужен результат, чтобы быть так:

12 - Направление Пон-Вио/Направление Métro Картье

ИЛИ

12 - Направление Pont-Viau/Métro Cartier

Я могу использовать два массива, но я хотел бы сделать это в MySQL. Кроме того, я получил другие маршруты в таблице, например, маршрут 13, 15 и т. Д., Поэтому ему нужно работать в SELECT ALL. У кого-нибудь есть идея?

Большое спасибо

+0

вам необходимо проинструктировать нас, как присоединиться к вашим маршрутам вместе, чтобы дать ожидаемые данные. Ваш идентификатор маршрута не совпадает, и вы не предоставляете «маршруты» для своего маршрута, за исключением «E» и «O» в route_id ... –

+0

Не возможно ли с помощью 'group_concat()'? –

+0

@MathieuDumoulin Я не создал эту таблицу ... Проблема в том, что она должна работать так, чтобы она работала со всеми другими таблицами маршрутов от других компаний ... эта проблема. –

ответ

1

Чтобы объединить две строки, используйте 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. Возвращает короткое имя, тире, длинное имя 1, слэш, длинное имя 2.
  2. Регистрация на основе первых 8 символов идентификаторов (LEFT(str, n) возвращает первый n символов строки).
  3. Идентификаторы могут быть несовместимыми (что препятствует соединению с самим собой).

Это может быть довольно медленным (из-за использования LEFT()), но MySQL может иметь черную магию, которая также может помочь оптимизировать вещи и индексы. Оцените это на своем реальном столе.

+0

+1, но стоит упомянуть, что форматирование вывода на стороне базы данных довольно глупо. – Tadeck

Смежные вопросы