2011-12-29 5 views
0

問題が発生しました。方向ポンViau /ディレクションメトロカルティエ他の行から1行を作成する

OR

-

12:

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 - Direction Pont-Viau /MétroCartier

私は2つの配列を使うかもしれませんが、私はこれをMySQLで行いたいと思います。また、私はルート13,15などのようにテーブルの他のルートを持っているので、SELECT ALLで作業する必要があります。

どうもありがとう

+0

あなたのルートを一緒に参加させて、予想されるデータを与える方法を教えてください。あなたのルートIDは一致しておらず、route_idの "E"と "O"を除いてあなたのルートに "方向"を指定していません。 –

+0

'group_concat()'では可能ではありませんか? –

+0

@MathieuDumoulin私はこのテーブルを作成しませんでした...問題は、それが他の会社の他のすべてのルートテーブルで動作する方法で動作する必要があるということです...その問題。 –

答えて

1

CONCAT()を使用し、2つの文字列を結合するには。グループ内の値を結合するには、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ごとに1つの行を返します。それらをすべて取得するには、サブクエリを使用します。

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は、私が仮定するものとは異なり、実際にデータベース構造とは全く無関係であると思われます。

私は上記の回答を残しました。これは、他の人に役立つ可能性があるためです。

私が正しく理解しているのであれば、で終わり、Oで終わるroute_idの2つのレコードを結合したいと考えています。

  • IDは常に8文字+ EO次のとおりです。次のことを仮定し

  • 一緒に属しているレコードは常に2つあります。その場合

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. IDの最初の8文字に基づいて結合します(LEFT(str, n)は、文字列の最初のn文字を返します)。
  3. IDは完全一致ではない可能性があります(自己への参加を妨げる)。

これはかなり遅いかもしれませんが(LEFT()を使用しているため)、MySQLは物やインデックスを最適化する黒い魔法を持っている可能性があります。あなたの本物のテーブルにそれをベンチマークする。

+0

+1しかし、データベース側の出力をフォーマットすることはむしろ愚かであると言及する価値があります。 – Tadeck

関連する問題