【发布时间】:2011-08-15 02:01:18
【问题描述】:
我有一个托管的在线商店产品,它支持各种数据类型的自定义字段。切入正题,任何人都可以通过添加到定义为的表来向任何记录添加额外的键/值对:
`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`)
在欧洲,很多人都希望支持多种语言,因此每个键可以针对不同的区域设置多个值。每个商店都有一个默认区域(由店主指定)和一个活动区域(由客户选择)。
我试图放在一起的查询的行为如下:
-
storeId、table和id以及活动区域设置和默认区域设置都是已知的。 - 如果某个键的值不适用于活动区域设置,则会返回默认区域设置的值。
- 如果默认语言环境的值也不可用,则返回任何其他语言环境的值。
我想出了一个非常尴尬的查询,可以达到预期的结果。假设店铺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`;
这行得通,但它很难看,而且似乎效率低下。我知道有更好的方法,但我无法确定。
有人能推荐更好的吗?
非常感谢!
【问题讨论】:
-
我过去做过类似的事情。不过我的设置有点不同:每件事都有其原始/默认语言,然后是一组翻译。这样一来,您就没有第三个选择,要么是他们的语言,要么是他们获得物品的母语。 OTOH,
en_AU在英国确实有一定的吸引力:) -
好吧,事实证明我正在做的是最好的事情。那好吧。一个人可以做梦。
标签: mysql syntax localization subquery