MySQL:'從......中選擇文字作為<此處變數或子查詢>”
P粉012875927
P粉012875927 2024-04-06 19:25:54
0
2
734

我有下表,其中包含以下資料:

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;」但這不起作用。

有沒有辦法在一個查詢中做到這一點?

乾杯,托馬斯

P粉012875927
P粉012875927

全部回覆(2)
P粉805931281

您必須稍微更改一下表架構;新增了對要使用的語言進行分組的參考

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');
P粉520545753

您可以使用的一個選項是 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 變數中分配的語句,您將得到預期的結果。

示範小提琴

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!