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;

然而,这当然是完全不灵活的。它仅适用于我目前指定的两种语言。当我添加一种新语言时,我必须手动更新查询以将其考虑在内。

我需要上述查询的通用版本,它能够生成正确的表输出,而无需了解存储在源表中的数据的任何信息。

一些消息来源声称你不能在 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 回答