我有下表,其中包含以下数据:
| id | 文本 | 语言 |
|---|---|---|
| 1 | 德语文本 | 德语 |
| 2 | 英文文本 | 英语 |
我想要的是获得以下格式的结果:
german="deutscher text" english="english text"
这个意思,应该是不:
text="deutscher text" text="english text"
键/列名称text应该是来自language的数据
我尝试了以下查询,但它不起作用:
SELECT text as (SELECT language FROM `table` where id = 1) FROM `table` where id = 1;
(SELECT language FROM table where id = 1) 将返回“german”,因此查询应为:
“从 table 选择德语文本,其中 id = 1;”但这不起作用。
有没有办法在一个查询中做到这一点?
干杯,托马斯
您必须稍微更改一下表架构;添加了对要使用的语言进行分组的引用
然后是SQL
SELECT T.text AS english, T2.text AS german FROM test T INNER JOIN test T2 ON T.ref = T2.ref AND T2.`language` = 'german' WHERE T.ref = 1 AND T.language = 'english'虚拟数据
INSERT INTO `test` (`id`, `ref`, `text`, `language`) VALUES (1, 1, 'deutscher text', 'german'), (2, 1, 'english text', 'english');您可以使用的一个选项是
PREPARED STATMENT:SET @sql := NULL; SELECT GROUP_CONCAT( CONCAT('MAX(CASE WHEN language="',language,'" THEN text END) AS "',language,'"')) INTO @sql FROM mytable; SELECT CONCAT('SELECT ',@sql,' FROM mytable;') INTO @sql; PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;第一步是动态分配
@sql变量所需的列。然后,将先前分配的@sql变量与最终SELECT查询的其余部分连接起来,然后将其重新分配给@sql变量。查询将以:SELECT MAX(CASE WHEN language="german" THEN text END) AS "german", MAX(CASE WHEN language="english" THEN text END) AS "english" FROM mytable;最后,我们准备、执行然后取消分配在
@sql变量中分配的语句,您将得到预期的结果。演示小提琴