所以我有2个具有以下模式的表:
CREATE TABLE IF NOT EXISTS `languages` (
`code` varchar(14) COLLATE utf8mb4_unicode_520_ci NOT NULL, // language code
`name` varchar(300) COLLATE utf8mb4_unicode_520_ci NOT NULL, // native language name
PRIMARY KEY (`code`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
CREATE TABLE IF NOT EXISTS `langs_local` (
`code` varchar(14) COLLATE utf8mb4_unicode_520_ci NOT NULL, // original language code
`code_local` varchar(14) COLLATE utf8mb4_unicode_520_ci NOT NULL, // local language code
`name` varchar(300) COLLATE utf8mb4_unicode_520_ci NOT NULL, // localized name
PRIMARY KEY (`code`,`code_local`),
KEY `code` (`code`),
KEY `code_local` (`code_local`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci;
这个想法是,表languages
以其本机形式保存语言代码和语言名称,而表langs_local
则保存根据需要添加的本地化语言名称。因此,如果我需要本机形式的语言列表(用于前端),请转到languages
,但是如果我需要本地化的列表(用于BackOffice),请使用langs_local
。
我在获取本地化语言名称时遇到问题。想象一下,后端语言设置为pt-PT
(葡萄牙语(葡萄牙)),后备语言为en
(无区域英语)。
对于每种语言,我需要获得pt-PT
版本(如果存在),否则需要pt
版本(如果存在),否则需要en
版本(对于当然)。
我不能只执行'SELECT * FROM langs_local WHERE code_local ='pt-PT'and if empty get the next possibility and so on because there could be partial content with
pt-PT`,而只有其他选项具有后续后备功能。
表languages
定义了总共存在哪些语言代码(或本地化的en
也可以这样做)。
有一种方法可以一次完成吗?
答案 0 :(得分:0)
好吧-我想我发现了一个复杂的方法
SELECT `languages`.`code`, `languages`.`name` AS `nativeName`, `local`.`name` AS `localizedName`
FROM `languages`
INNER JOIN (SELECT `langs_local`.`code`, `langs_local`.`code_local`, `langs_local`.`name`, `l`.`priority`
FROM `langs_local`
INNER JOIN (SELECT `tmp`.`code`, `tmp`.`code_local`, `tmp`.`priority`
FROM (SELECT `code`, `code_local`, (CASE WHEN `code_local` = 'pt-PT' THEN 1 WHEN `code_local` = 'pt' THEN 2 WHEN `code_local` = 'en' THEN 3 ELSE 4 END) AS `priority`
FROM `langs_local`) AS `tmp`
WHERE `tmp`.`priority` = (SELECT MIN(CASE WHEN `tmp2`.`code_local` = 'pt-PT' THEN 1 WHEN `tmp2`.`code_local` = 'pt' THEN 2 WHEN `tmp2`.`code_local` = 'en' THEN 3 ELSE 4 END) AS `priority`
FROM `langs_local` AS `tmp2`
WHERE `tmp2`.`code` = `tmp`.`code`)) AS `l`
ON `langs_local`.`code` = `l`.`code` AND `langs_local`.`code_local` = `l`.`code_local`) AS `local`
ON `languages`.`code` = `local`.`code`
欢迎任何评论或简化。