Mysql根据文本语言或行数将列拆分为多列

问题描述 投票:0回答:4

我有一个如下所示的专栏

id | Text    
1  | English text1    
2  | English text2    
3  | English text3    
4  | English text4

5  | French text1    
6  | French text2    
7  | French text3    
8  | French text4

9  | Arabic text1    
10 | Arabic text2    
11 | Arabic text3    
12 | Arabic text4

等...

我想做成这样

id | EngText            FreText          ArbText    
1  | English text1    French text1    Arabic text1    
2  | English text2    French text2    Arabic text2    
3  | English text3    French text3    Arabic text3    
4  | English text4    French text4    Arabic text4  

如果可能,使用 phpMyAdmin 或 MySQL 查询。通过检测文本语言或 id 的数量,其中每 4 行将在不同的列中。

我用 4 只是作为例子,但实际上它们比每种语言具有相同行数的行数更多。

谢谢

mysql phpmyadmin
4个回答
1
投票

你可以这样做:

select max(case when id/4 <= 1 then Text end) as 'EngText',
        max(case when (id/4 <= 2 and id/4 > 1) then Text end) as 'FreText',
        max(case when (id/4 <= 3 and id/4 > 2) then Text end) as 'ArbText'
from mytable
group by id mod 4 

id/4
将产生从 0 到 1 的英语数字,1 到 2 的法语数字和 2 到 3 的阿拉伯语数字,因此我们可以使用
max() case when
子句按每种语言对数据进行分组。

id mod 4
将有助于并排分组数据。

另一种方法:

select max(case when (id - 0.001) div 4 = 0 then Text end) as 'EngText',
        max(case when (id - 0.001) div 4 = 1 then Text end) as 'FreText',
        max(case when (id - 0.001) div 4 = 2 then Text end) as 'ArbText'
from mytable
group by id mod 4 

这里演示


0
投票

如果您想按照自己的方式进行,因为这是一次性操作,最好通过创建一个包含您需要的所有语言字段的新表来最好,并且只需对每种语言一次查询一个,因为您的语言字段有独特的名字。

INSERT INTO newTable (id, englishText)
SELECT mod(id-1, <nr of languages>)+1)+1, Text
FROM oldTable
ON DUPLICATE KEY UPDATE englishText=VALUE(englishText)

并为每种具有适当字段名称的语言运行此程序。


0
投票

意识到如果你这样做,如果你添加或删除一种语言,你将不得不更改数据库结构。这不是好的做法。

我理解这样做的冲动,但这不是好的做法。除非你真的非常确定永远不必添加或删除语言(你曾经在这个世界上吗?),否则请选择一个表结构,其中你有一个具有唯一 ID(自动编号)、textId、languageId(textId+ languageId 一起唯一)和该语言的文本。那是基本的结构数据库设计。

如果你确信并想那样做,你只需要将原始表复制到新表中,使用

INSERT INTO newTable (id, textId, languageId, text)
SELECT NULL, mod(id-1, <nr of languages>)+1, FLOOR((id-1)/<nr of languages>)+1, text
FROM oldTable 

接下来你创建一个语言表来根据你在结果中得到的数字定义语言,列 id, language (VARCHAR)

INSERT INTO languages (id, language)
SELECT DISTINCT languageId, 'Fill in language name manually'
FROM newTable

(注意:我不能将此作为评论发布,因为它太长了。发布了一个解决方案,以 OP 想要的方式回答问题(即使一般做法不好)。)


0
投票

您最好更改表的结构以包含要翻译的字符串的唯一标识符和语言的标识符。

我强烈反对您当前的方法,但此查询将提供您要求的结果:

SELECT l1.id, l1.text, l2.text, l3.text
FROM (SELECT COUNT(*) DIV 3 AS cnt FROM lang) v
JOIN lang l1 ON l1.id <= v.cnt
JOIN lang l2 ON l2.id = l1.id + v.cnt
JOIN lang l3 ON l3.id = l2.id + v.cnt
© www.soinside.com 2019 - 2024. All rights reserved.