MySQL : "Sélectionnez le texte de... comme <variable ici ou sous-requête>"
P粉012875927
P粉012875927 2024-04-06 19:25:54
0
2
907

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应该是来自languageDonné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粉012875927
P粉012875927

répondre à tous(2)
P粉805931281

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粉520545753

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.

Démo Violon

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal