2012-04-26 35 views
2

我有一個表格用於保存翻譯。它奠定了如下:將MySQL表格重新格式化爲網格

id | iso | token | content 
----------------------------------------------- 
1 | GB | test1 | Test translation 1 (English) 
2 | GB | test2 | Test translation 2 (English) 
3 | FR | test1 | Test translation 1 (French) 
4 | FR | test2 | Test translation 2 (French) 

// etc 

對於翻譯管理工具與表一起去,我需要它輸出的東西更像是一個電子表格網格:

token   | GB       | FR       | (other languages) --> 
------------------------------------------------------------------------------------------- 
test1   | Test translation 1 (English) | Test translation 1 (French) | 
test2   | Test translation 1 (French) | Test translation 2 (French) | 
(other tokens) |        |        | 
     |  |        |        | 
     |  |        |        | 
     V  |        |        | 

我想這將是很容易,但事實證明,這比我預料的要困難得多!

很多搜​​索後和周圍挖我發現GROUP_CONCAT,這對於具體情況上面我可以開始工作,併產生輸出我在尋找:

select 
    token, 
    group_concat(if (iso = 'FR', content, NULL)) as 'FR', 
    group_concat(if (iso = 'GB', content, NULL)) as 'GB' 
from 
    translations 
group by token; 

然而,這是,當然,完全不靈活。它只適用於我迄今指定的兩種語言。當我添加一種新語言時,我必須手動更新查詢以將其考慮在內。

我需要上述查詢的通用版本,這將能夠生成正確的表輸出,而不必知道存儲在源表中的任何數據。

有些消息來源聲稱你不能在MySQL中輕鬆做到這一點,但我相信它一定是可能的。畢竟,這首先是數據庫存在的事情。

有沒有辦法做到這一點?如果是這樣,怎麼樣?

+0

有沒有通用的查詢來實現你想要的。您必須爲每種語言手動添加「GROUP_CONCAT」或「JOIN」。 – 2012-04-26 12:14:13

+0

或者只是在客戶端進行轉換... – 2012-04-26 12:14:38

+0

實際上,我們已經將我們的翻譯系統從「網格」樣式系統轉移到更靈活的系統,如您正在從中移動。我們發現對錶格的手動更改比預期更規則。起初我們認爲更少的行會更好,但是這等於更多的工作,更多的工作作爲「網格」。我的建議是保持原樣,除非你有一個令人信服的理由來改變。 – Ryan 2012-04-26 18:09:59

回答

1

因爲MySQL的限制,我需要做這樣的事情上查詢側和1個查詢,我會做這樣的:

查詢:

select token, group_concat(concat(iso,'|',content)) as contents 
from translations 
group by token 

「令牌」 ; 「內容」

「測試1」,「GB |試譯1(英語),FR |試譯1 (FR IT |測試翻譯2 (意大利語)「

(意大利語)測試翻譯1(意大利語)」「test2」;「GB |測試翻譯

比我雖然綁定行,我可以從逗號分割成行和從管道拆分頭。

2

您尋求的內容通常稱爲動態交叉表,您可以動態確定輸出中的列。從根本上講,關係數據庫不是爲動態確定模式而設計的。實現所需目標的最佳方法是使用中間層組件構建交叉表SQL語句,類似於您所顯示的內容,然後執行該語句。

+0

似乎很奇怪,SQL不支持這一點,它畢竟應該是一個從數據建立報告的工具。 – GordonM 2012-04-27 09:10:53

+0

@GordonM - 一旦你明白了爲什麼,原因很明顯。列代表表格的模式。關係數據庫的基本假設是模式在設計階段是已知的。數據庫不是用於構建報告的工具。數據庫是用於存儲和管理數據的工具(主要是事實)。報表引擎是構建報表的工具,並且他們通常會提供動態交叉表功能。 – Thomas 2012-04-27 15:54:27