2011-12-29 38 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 - 方向蓬維奧/方向的地鐵卡地亞

OR

12 - 方向Pont-Viau /地鐵卡地亞

我想我可能會使用兩個數組,但我想在MySQL中這樣做。此外,我得到了像路線13,15等其他路線,所以它需要工作在一個選擇所有任何人有任何想法?

非常感謝

+0

您需要指導我們如何一起加入您的路線以提供預期的數據。你的路由ID不匹配,除了route_id中的「E」和「O」之外,你沒有爲路由提供「路線」... – 2011-12-29 16:03:08

+0

對於'group_concat()'來說這不可能嗎? – 2011-12-29 16:05:29

+0

@MathieuDumoulin我沒有建立這個表...問題是它需要以一種方式工作,它將與來自其他公司的所有其他路由表一起工作......這個問題。 – 2011-12-29 16:07:48

回答

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_idE和一個與O結束。

假設以下幾點:

  • 的ID總是8個字符+的EO或。
  • 總是有兩條記錄屬於一起。

在這種情況下:

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 2011-12-29 16:27:29