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文字+
E
かO
次のとおりです。次のことを仮定し 。
- 一緒に属しているレコードは常に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、スラッシュ、長い名前2。
- IDの最初の8文字に基づいて結合します(
LEFT(str, n)
は、文字列の最初のn文字を返します)。
- IDは完全一致ではない可能性があります(自己への参加を妨げる)。
これはかなり遅いかもしれませんが(LEFT()
を使用しているため)、MySQLは物やインデックスを最適化する黒い魔法を持っている可能性があります。あなたの本物のテーブルにそれをベンチマークする。
あなたのルートを一緒に参加させて、予想されるデータを与える方法を教えてください。あなたのルートIDは一致しておらず、route_idの "E"と "O"を除いてあなたのルートに "方向"を指定していません。 –
'group_concat()'では可能ではありませんか? –
@MathieuDumoulin私はこのテーブルを作成しませんでした...問題は、それが他の会社の他のすべてのルートテーブルで動作する方法で動作する必要があるということです...その問題。 –