要合併兩個字符串,用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
結束。
假設以下幾點:
- 的ID總是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。
- 根據ID的前8個字符進行連接(
LEFT(str, n)
返回字符串的第一個n個字符)。
- 這些ID可能不完全匹配(這會阻止與自己的連接)。
這可能會很慢(因爲使用了LEFT()
),但是MySQL可能有一些優化事物和索引的黑魔法也可能有幫助。在您的真實表格上對其進行基準測試
您需要指導我們如何一起加入您的路線以提供預期的數據。你的路由ID不匹配,除了route_id中的「E」和「O」之外,你沒有爲路由提供「路線」... – 2011-12-29 16:03:08
對於'group_concat()'來說這不可能嗎? – 2011-12-29 16:05:29
@MathieuDumoulin我沒有建立這個表...問題是它需要以一種方式工作,它將與來自其他公司的所有其他路由表一起工作......這個問題。 – 2011-12-29 16:07:48