problema:
dado é uma tabela com suporte a idiomas (traduções)
um usuário pode configurar uma lista de idiomas (a ordem é prioridade)
agora eu tenho que pegar todas as linhas que fazem parte app
e locale
está na lista de idiomas pré-configurados para um usuário;
apenas UM resultado por cada property
será devolvido
por exemplo, o usuário configurou de-AT, de-DE, de, en
como configurações de usuário preferenciais NOTA: nem todos os valores precisam ser definidos!
o usuário solicita todos os dados para app='test'
o resultado esperado é
property, value
('father', 'Oida'),
('lastName', 'Nachname'),
Tabela para dados multilíngue
CREATE TABLE IF NOT EXISTS `i18n` (
`id` INT NOT NULL AUTO_INCREMENT,
`app` VARCHAR(20) NULL,
`locale` VARCHAR(10) NULL,
`property` VARCHAR(20) NULL,
`value` VARCHAR(1000) NULL,
PRIMARY KEY (`id`)
);
valores de exemplo na i18n
tabela
INSERT INTO `i18n` (app, locale, property, value)
VALUES
('test', 'de-AT', 'father', 'Oida'),
('test', 'de-DE', 'father', 'Papa'),
('test', 'de', 'father', 'Vater'),
('test', 'en', 'father', 'father'),
('test', 'fr', 'father', 'père'),
('test', 'en','lastName', 'last name'),
('test', 'de','lastName', 'Nachname'),
('test', 'fr','lastName', 'nom de famille'),
minha ideia era colocar a configuração do usuário em sua própria tabela (se for possível sem isso seria ainda melhor)
Tabela para configuração do usuário
CREATE TABLE IF NOT EXISTS `i18n_cfg` (
`id` INT NOT NULL AUTO_INCREMENT,
`user` VARCHAR(20) NULL,
`locale` VARCHAR(10) NULL,
`priority` INT NULL,
PRIMARY KEY (`id`)
);
valores de exemplo na i18n_cfg
tabela
INSERT INTO `i18n_cfg` (locale, user, priority)
VALUES
('de-AT', 'lm', 1),
('de-DE', 'lm', 2),
('de', 'lm', 3),
('en', 'lm', 4),
('de', 'hr', 1),
('en','hr', 2),
eu realmente não estou chegando a um ponto eu recebo apenas um resultado ou muito
NOTA usando o mysql 5.7 (se funcionasse no sql server também - com pequenas alterações - seria perfeito)
você precisa juntar a tabela com prioridade e usar a função ROW_NUMBER para classificar as linhas para cada propriedade, então você só precisa deixar as linhas com número de linha = 1:
solução sem funções e variáveis de janela:
link para dbfiddle: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=cf1d3f4757c3d84d3f5ad2bea0966a3c