我有一个托管的在线商店产品,支持各种数据类型的自定义字段。切入追逐,任何人都可以通过添加到定义为的表来为任何记录添加额外的键/值对:
`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`;
这很有效,但它很难看,看起来效率低下。我知道有更好的方法,但我不能把手指放在上面。
有人能提出更好的建议吗?
非常感谢!
答案 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'
。