以优先级值连接表

时间:2018-09-05 17:46:35

标签: mysql

所以我有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也可以这样做)。

有一种方法可以一次完成吗?

1 个答案:

答案 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`

欢迎任何评论或简化。