MySQL:'从......中选择文本作为<此处变量或子查询>”
P粉012875927
P粉012875927 2024-04-06 19:25:54
0
2
712

我有下表,其中包含以下数据:

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;”但这不起作用。

有没有办法在一个查询中做到这一点?

干杯,托马斯

P粉012875927
P粉012875927

全部回复(2)
P粉805931281

您必须稍微更改一下表架构;添加了对要使用的语言进行分组的引用

CREATE TABLE IF NOT EXISTS `test` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ref` int(11) DEFAULT 0,
  `text` varchar(50) DEFAULT NULL,
  `language` varchar(50) DEFAULT NULL,
  KEY `Index 1` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb3;

然后是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');
P粉520545753

您可以使用的一个选项是 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 变量中分配的语句,您将得到预期的结果。

演示小提琴

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!