cari

Rumah  >  Soal Jawab  >  teks badan

MySQL: "Pilih teks daripada... sebagai <variable here or subquery>"

Saya mempunyai jadual berikut dengan data berikut:

id Teks Bahasa
1 Teks bahasa Jerman Jerman
2 Teks bahasa Inggeris Bahasa Inggeris

Apa yang saya mahukan ialah mendapatkan keputusan dalam format berikut:

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

Ini sepatutnya bermakna bukan :

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

Nama Kunci/Lajurtext应该是来自languageData

Saya mencuba pertanyaan berikut tetapi tidak berjaya:

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

(SELECT language FROM table where id = 1) akan mengembalikan "jerman", jadi pertanyaannya hendaklah: "Pilih teks Jerman dari table di mana id = 1;" tetapi ini tidak berfungsi.

Adakah terdapat cara untuk melakukan ini dalam satu pertanyaan?

Sekian, Thomas

P粉012875927P粉012875927263 hari yang lalu991

membalas semua(2)saya akan balas

  • P粉805931281

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

    Anda perlu menukar sedikit skema jadual; menambah rujukan untuk mengumpulkan bahasa yang anda mahu gunakan

    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;

    Kemudian 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'
    

    Data palsu

    INSERT INTO `test` (`id`, `ref`, `text`, `language`) VALUES
        (1, 1, 'deutscher text', 'german'),
        (2, 1, 'english text', 'english');
    

    balas
    0
  • P粉520545753

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

    Satu pilihan yang boleh anda gunakan ialah 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;

    Langkah pertama ialah memperuntukkan pembolehubah @sql 变量所需的列。然后,将先前分配的 @sql 变量与最终 SELECT 查询的其余部分连接起来,然后将其重新分配给 @sql secara dinamik. Pertanyaan akan dihantar ke:

    SELECT MAX(CASE WHEN language="german" THEN text END) AS "german",
           MAX(CASE WHEN language="english" THEN text END) AS "english" 
    FROM mytable;

    Akhir sekali, kami menyediakan, melaksanakan dan kemudian mengalokasikan penyataan yang diperuntukkan dalam pembolehubah @sql dan anda akan mendapat hasil yang diharapkan.

    Demo Violin

    balas
    0
  • Batalbalas