2

翻訳を保持するためのテーブルがあります。次のようにレイアウトされています。

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;

ただし、これはもちろん、まったく柔軟性がありません。これまでに指定した 2 つの言語でのみ機能します。新しい言語を追加するとすぐに、クエリを手動で更新して考慮に入れる必要があります。

ソース テーブルに格納されているデータについて何も知らなくても、正しいテーブル出力を生成できる、上記のクエリの一般化されたバージョンが必要です。

一部の情報源は、MySQL ではこれを簡単に実行できないと主張していますが、私はそれが可能であるに違いないと確信しています。結局のところ、これはそもそもデータベースが存在するようなものです。

これを行う方法はありますか?もしそうなら、どのように?

4

2 に答える 2

2

求めるものは、動的クロス集計と呼ばれることが多く、出力の列を動的に決定します。基本的に、リレーショナルデータベースはスキーマを動的に決定するようには設計されていません。目的を達成するための最良の方法は、中間層コンポーネントを使用して、表示したものと同様のクロス集計SQLステートメントを作成し、それを実行することです。

于 2012-04-26T18:07:00.683 に答える
2

mysql の制限により、クエリ側で次のようなことを行う必要があり、1 つのクエリで次のようにします。

クエリ:

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

「トークン」;「内容」

"test1";"GB|テスト翻訳 1 (英語),FR|テスト翻訳 1 (フランス語),IT|テスト翻訳 1 (イタリア語)" "test2";"GB|テスト翻訳 2 (英語),FR|テスト翻訳2 (フランス語),IT|テスト翻訳 2 (イタリア語)"

行をバインドしている間に、カンマから行に分割し、パイプからヘッダーに分割できます..

于 2012-04-26T18:30:27.120 に答える