我有下表,其中包含以下資料:
| 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;」但這不起作用。
有沒有辦法在一個查詢中做到這一點?
乾杯,托馬斯
您必須稍微更改一下表架構;新增了對要使用的語言進行分組的參考
然後是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');您可以使用的一個選項是
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變數中分配的語句,您將得到預期的結果。示範小提琴