AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / dba / Perguntas / 280428
Accepted
lumo
lumo
Asked: 2020-11-28 01:53:31 +0800 CST2020-11-28 01:53:31 +0800 CST 2020-11-28 01:53:31 +0800 CST

junte duas tabelas e limite os resultados por uma lista ordenada

  • 772

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 appe localeestá na lista de idiomas pré-configurados para um usuário;

apenas UM resultado por cada propertyserá devolvido

por exemplo, o usuário configurou de-AT, de-DE, de, encomo 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 i18ntabela

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_cfgtabela

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)

mysql
  • 1 1 respostas
  • 44 Views

1 respostas

  • Voted
  1. Best Answer
    NikitaSerbskiy
    2020-11-28T02:21:15+08:002020-11-28T02:21:15+08:00

    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:

    WITH CTE AS (
    SELECT t1.property
    ,t1.value
    ,ROW_NUMBER() OVER (PARTITION BY t1.property ORDER BY t2.priority) AS rn
    FROM i18n t1
    JOIN i18n_cfg t2 ON t1.locale = t2.locale
    WHERE t1.app = 'test' 
    AND t2.user = 'lm'
    )
    SELECT property, value
    FROM CTE 
    WHERE rn = 1
    

    solução sem funções e variáveis ​​de janela:

    SELECT t1.property 
    ,(SELECT t2.value
      FROM i18n AS t2
      JOIN i18n_cfg AS t3 ON t2.locale = t3.locale
      WHERE t2.property = t1.property
      AND t2.app = 'test'
      AND t3.user = 'lm'
      ORDER BY t3.priority
      LIMIT 1) AS value
    FROM
    (
    SELECT DISTINCT property
    FROM i18n
    WHERE app = 'test'
    ) AS t1
    

    link para dbfiddle: https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=cf1d3f4757c3d84d3f5ad2bea0966a3c

    • 1

relate perguntas

  • Existem ferramentas de benchmarking do MySQL? [fechado]

  • Onde posso encontrar o log lento do mysql?

  • Como posso otimizar um mysqldump de um banco de dados grande?

  • Quando é o momento certo para usar o MariaDB em vez do MySQL e por quê?

  • Como um grupo pode rastrear alterações no esquema do banco de dados?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host

    • 12 respostas
  • Marko Smith

    Como fazer a saída do sqlplus aparecer em uma linha?

    • 3 respostas
  • Marko Smith

    Selecione qual tem data máxima ou data mais recente

    • 3 respostas
  • Marko Smith

    Como faço para listar todos os esquemas no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Listar todas as colunas de uma tabela especificada

    • 5 respostas
  • Marko Smith

    Como usar o sqlplus para se conectar a um banco de dados Oracle localizado em outro host sem modificar meu próprio tnsnames.ora

    • 4 respostas
  • Marko Smith

    Como você mysqldump tabela (s) específica (s)?

    • 4 respostas
  • Marko Smith

    Listar os privilégios do banco de dados usando o psql

    • 10 respostas
  • Marko Smith

    Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL?

    • 4 respostas
  • Marko Smith

    Como faço para listar todos os bancos de dados e tabelas usando o psql?

    • 7 respostas
  • Martin Hope
    Jin conectar ao servidor PostgreSQL: FATAL: nenhuma entrada pg_hba.conf para o host 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane Como faço para listar todos os esquemas no PostgreSQL? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh Por que o log de transações continua crescendo ou fica sem espaço? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland Listar todas as colunas de uma tabela especificada 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney O MySQL pode realizar consultas razoavelmente em bilhões de linhas? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx Como posso monitorar o andamento de uma importação de um arquivo .sql grande? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison Como você mysqldump tabela (s) específica (s)? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas Como posso cronometrar consultas SQL usando psql? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas Como inserir valores em uma tabela de uma consulta de seleção no PostgreSQL? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas Como faço para listar todos os bancos de dados e tabelas usando o psql? 2011-02-18 00:45:49 +0800 CST

Hot tag

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve