Maison > Questions et réponses > le corps du texte
J'ai le tableau suivant avec les données suivantes :
id | Texte | Langue |
---|---|---|
1 | Texte allemand | Allemand |
2 | Texte anglais | Anglais |
Ce que je souhaite, c'est obtenir des résultats au format suivant :
german="deutscher text" english="english text"
Cela devrait signifier et non :
text="deutscher text" text="english text"
Nom de la clé/colonnetext
应该是来自language
Données
J'ai essayé la requête suivante mais cela ne fonctionne pas :
SELECT text as (SELECT language FROM `table` where id = 1) FROM `table` where id = 1;
(SELECT language FROM
table where id = 1)
renverra "allemand", donc la requête devrait être :
"Sélectionnez le texte allemand à partir de table
où id = 1 ;" mais cela ne fonctionne pas.
Existe-t-il un moyen de le faire en une seule requête ?
Bravo, Thomas
P粉8059312812024-04-07 16:18:50
Vous devez modifier un peu le schéma du tableau ; ajout d'une référence pour regrouper les langues que vous souhaitez utiliser
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;
Puis 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'
Données factices
INSERT INTO `test` (`id`, `ref`, `text`, `language`) VALUES
(1, 1, 'deutscher text', 'german'),
(2, 1, 'english text', 'english');
P粉5205457532024-04-07 13:43:46
Une option que vous pouvez utiliser est 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;
La première étape consiste à allouer dynamiquement la variable @sql
变量所需的列。然后,将先前分配的 @sql
变量与最终 SELECT
查询的其余部分连接起来,然后将其重新分配给 @sql
. Les demandes seront envoyées à :
SELECT MAX(CASE WHEN language="german" THEN text END) AS "german", MAX(CASE WHEN language="english" THEN text END) AS "english" FROM mytable;
Enfin, nous préparons, exécutons puis désallouons l'instruction allouée dans la variable @sql
et vous obtiendrez le résultat attendu.