使用子查询进行MySQL中的语言环境回退

时间:2011-08-15 02:01:18

标签: mysql syntax localization subquery

我有一个托管的在线商店产品,支持各种数据类型的自定义字段。切入追逐,任何人都可以通过添加到定义为的表来为任何记录添加额外的键/值对:

`storeId` varchar(20) NOT NULL,
`locale` varchar(100) NOT NULL,
`table` varchar(30) NOT NULL,
`id` varchar(50) NOT NULL,
`key` varchar(30) NOT NULL,
`value` mediumblob NOT NULL,
PRIMARY KEY (`storeId`, `locale`, `table`, `id`, `key`)

在欧洲,很多人都希望支持多种语言,因此每个键可以为不同的语言环境提供多个值。每个商店都有一个默认的区域设置(由商店所有者指定)和一个活动的区域设置(由客户选择)。

我试图整理的查询表现如下:

  • storeIdtableid都是已知的,活动区域设置和默认区域设置也是如此。
  • 如果某个键的值不适用于活动区域设置,则会返回默认区域设置的值。
  • 如果默认语言环境的值也不可用,请返回任何其他语言环境的值。

我想出了一个非常尴尬的查询,可以达到预期的效果。假设商店ID为1,表格为Products,ID为gadget1;默认语言环境为en_AU,活动语言环境为de_DE。这是我们要查询的内容:

SELECT * FROM 
    (SELECT `key`, `value` 
    FROM nf_CustomFields 
    WHERE `storeId` = 1
        AND `table` = 'Products'
        AND `id` = 'gadget1'
    ORDER BY `locale`='de_DE' DESC, 
        `locale`='en_AU' DESC
    ) 
AS a 
GROUP BY `key`;

这很有效,但它很难看,看起来效率低下。我知道有更好的方法,但我不能把手指放在上面。

有人能提出更好的建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

您可以尝试LEFT JOINing nf_CustomFields给自己,然后使用COALESCE忽略如果没有本地语言行,LEFT JOIN将产生的NULL。像这样(未经测试,可能不工作)的查询:

select coalesce(nl.`key`,   def.`key`),
       coalesce(nl.`value`, def.`value`)
from nf_CustomFields nl
left outer join nfCustomFields def
     on nl.`store`  = def.`store`
    and nl.`table`  = def.`table`
    and nl.`id`     = def.`id`
    and nl.`locale` = 'de_DE'
 where def.`locale` = 'en_AU'
   and def.`id`     = KNOWN
   and def.`store`  = KNOWN
   and def.`table`  = KNOWN

当然,KNOWN会替换为您已知的值,当然您会使用真实动态值代替'de_DE''en_AU'