У меня есть продукт в интернет-магазине, который поддерживает настраиваемые поля для различных типов данных.Сокращение, чтобы погнать, любой может добавить дополнительные пары ключ / значение к любой записи, добавив в таблицу, которая определена как:
`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
, а также активная локаль и локаль по умолчанию. - Если значение для ключа недоступно для активной локали, значениевместо этого возвращается локаль по умолчанию.
- Если значение для локали по умолчанию также недоступно, верните значение для любой другой локали.
Iпридумали довольно неловкий запрос, который достигает желаемого результата.Допустим, идентификатор магазина равен 1
, таблица - Products
, а идентификатор - 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`;
Это работает, но уродливо и кажется неэффективным.Я знаю, что есть лучший способ, но я не могу понять, на что он способен.
Кто-нибудь может предложить что-то лучше?
Большое спасибо!