Heim  >  Fragen und Antworten  >  Hauptteil

MySQL: „Wählen Sie Text aus... als <Variable hier oder Unterabfrage>“

Ich habe die folgende Tabelle mit den folgenden Daten:

id Text Sprache
1 Deutscher Text Deutsch
2 Englischer Text Englisch

Ich möchte Ergebnisse im folgenden Format erhalten:

german="deutscher text"
english="english text"

Das sollte nicht bedeuten:

text="deutscher text"
text="english text"

Schlüssel-/Spaltennametext应该是来自languageDaten

Ich habe die folgende Abfrage versucht, aber sie funktioniert nicht:

SELECT text as (SELECT language FROM `table` where id = 1) FROM `table` where id = 1;

(SELECT language FROM table where id = 1) gibt „deutsch“ zurück, daher sollte die Abfrage wie folgt lauten: „Wählen Sie deutschen Text aus table, wobei id = 1;“ aber das funktioniert nicht.

Gibt es eine Möglichkeit, dies in einer Abfrage zu tun?

Cheers, Thomas

P粉012875927P粉012875927163 Tage vor508

Antworte allen(2)Ich werde antworten

  • P粉805931281

    P粉8059312812024-04-07 16:18:50

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

    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');
    

    Antwort
    0
  • P粉520545753

    P粉5205457532024-04-07 13:43:46

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

    演示小提琴

    Antwort
    0
  • StornierenAntwort