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 / user-47908

lumo's questions

Martin Hope
lumo
Asked: 2020-11-28 01:53:31 +0800 CST

junte duas tabelas e limite os resultados por uma lista ordenada

  • 0

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 respostas
  • 44 Views
Martin Hope
lumo
Asked: 2018-05-03 23:01:38 +0800 CST

Consultando uma lista ordenada com cláusula OR ou IN

  • 2

Estou consultando itemsa partir de um banco de dados e exibi-lo para o usuário. (no meu exemplo vou usar contactsem table tContacts.

O usuário seleciona alguns itemsem uma ordem que ele decide (o usuário pode escolher aleatoriamente os itens, então nenhuma coluna pode ser especificada para ordenar).

No aplicativo eu tenho os id's daqueles itemsem um arquivo ordered list.

Atualmente eu consulto mais detalhes para esses objetos one-by-one.

É possível criar uma consulta com uma "lista ordenada", que retorna itemsna mesma ordem ?

algo como (sim, isso é feio - provavelmente também atingindo o tamanho máximo da consulta sql):

SELECT * FROM (
    --how to append this list...
    SELECT 0 as listIndex, * from tContacts where conIdContact = 13259;
    SELECT 1 as listIndex, * from tContacts where conIdContact = 12472;
    [...]
    SELECT 568 as listIndex, * from tContacts where conIdContact = 12422;
)
ORDER BY listIndex
  • OU: eu tenho que continuar consultandoone-by-one
  • OU: isso precisa de uma tabela temporária (inserir id e prioridade), depois consultar e, em seguida, soltar a tabela temporária novamente.
  • OU: consulte a batche reordene os itens no código do aplicativo (isso pode ser lento devido a listas possivelmente grandes)

nota: uma solução independente de banco de dados é preferível (mariadb/mysql, postgresql e h2 são considerados usados ​​em produção.

meu conceito de tabela temporária:

CREATE TEMPORARY TABLE temp_OrderedContacts(
    listIndex INT NOT NULL DEFAULT 0,
    contactId INT NOT NULL DEFAULT 0
);

INSERT INTO temp_OrderedContacts (listIndex, contactId)
VALUES (0,13259), (1,12472), (2,12422);

SELECT * FROM tContacts
JOIN temp_OrderedContacts ON (tContacts.conIdContact = temp_OrderedContacts.contactId)

DROP TABLE temp_OrderedContacts;
query order-by
  • 1 respostas
  • 243 Views
Martin Hope
lumo
Asked: 2017-11-16 02:02:21 +0800 CST

Ignorar acentos na cláusula 'where'

  • 24

Em nosso banco de dados, temos várias entradas com acentos graves, acentos circunflexos ou carons (aka hačeks). Esses acentos são coletivamente também conhecidos como sinais diacríticos .

Agora, nossos usuários desejam encontrar entradas que incluam esses sinais diacríticos quando pesquisam entradas sem. Vou mostrar isso com um exemplo simples:

Em nosso banco de dados temos a entrada (contato com nome)

Millière

...então este nome está correto no país em que a pessoa vive.

Em nosso país não temos caracteres com sinais diacríticos, portanto nosso usuário procura por Milliere. Nenhum resultado aparece, como èobviamente não corresponde e.

Eu não tenho idéia de como isso poderia ser realizado como é, è, êe muitos mais estão disponíveis (e este é apenas um exemplo para carta e...).

(A outra maneira seria muito mais fácil, pois eu poderia simplesmente substituir todas as letras por caron/haček pela básica. Obviamente, nossos usuários querem a versão correta do nome no banco de dados, não a aleijada.)

sql-server sql-server-2008
  • 1 respostas
  • 27131 Views
Martin Hope
lumo
Asked: 2016-04-16 01:00:59 +0800 CST

selecionar apenas um elemento de um grupo ordenado por prioridade com limites?

  • 2

Esta pergunta procura uma resposta em sql puro (sem código específico do servidor db)

-edit- Devidos comentários/respostas: "pure sql" - SQL92/99 porque funciona em todos os servidores. Eu não uso esse código apenas no mysql, esse foi apenas o primeiro que tentei. Eu tenho que suportar Microsoft SQL Server (2000!), h2, PostGRE SQL e MySQL Server, mas o código também deve funcionar em outros (servidor db independente). Sinto muito se "pure sql" não foi detalhado o suficiente. Da próxima vez, especificarei o requisito da revisão do SQL (3/4, 92/99)

Eu tenho que ser compatível com versões anteriores. E é por isso que não especifiquei um servidor db. Isso foi de propósito. -fim-da-edição-

Eu tento pegar todos os valores de uma tabela com limites dados. Os dados que tenho para a consulta são: possíveis localidades e um max_priority

esta é a mesa para trabalhar

SELECT * FROM i18n

.

id|featureName|locale     |priority|text
--+-----------+-----------+--------+----
 1| type      |         en|       1|father
 2| type      |         de|       2|Vater
 3| type      |      de_AT|       3|Papa
 4| type      | de_AT_Wien|       4|Oida
 5| firstName |         en|       1|first name
 6| firstName |         de|       2|Vorname
 7| lastName  |         en|       1|last name
 8| lastName  |         de|       2|Nachname
 9| lastName  |         fr|       2|nom de famille
10| firstName |         fr|       2|prénom

então, por exemplo , eu tenho en, e um max_priority de 3 (que é a prioridade de ) espero isso como resultado: (a ordem desses resultados não é importante!)dede_ATde_AT

id|featureName|locale     |priority|text
--+-----------+-----------+--------+----
 3| type      |      de_AT|       3|Papa
 6| firstName |         de|       2|Vorname
 8| lastName  |         de|       2|Nachname

tentei resolver isso com um left outer join este é o melhor resultado que consegui obter:

SELECT DISTINCT nls1.*
FROM i18n nls1
LEFT OUTER JOIN i18n nls2
ON (
    nls1.featureName = nls2.featureName
    and nls1.priority > nls2.priority
)
WHERE nls2.priority<=3
AND (nls1.locale='en' OR nls1.locale='de' OR nls1.locale='de_AT')
GROUP BY featureName
ORDER BY featureName, priority DESC

mas isso seleciona essas linhas:

id|featureName|locale     |priority|text
--+-----------+-----------+--------+----
 2| type      |         de|       2|Vater
 6| firstName |         de|       2|Vorname
 8| lastName  |         de|       2|Nachname

outra tentativa foi

SELECT nls2.* 
FROM   i18n nls2 
       JOIN (SELECT Max(priority) max_priority, 
                    featurename, 
                    priority 
             FROM   i18n nls 
             WHERE  ( locale = 'en' 
                       OR locale = 'de' 
                       OR locale = 'de_AT' ) 
                    AND priority <= 3 
             GROUP  BY featurename) nls3 
         ON nls3.priority = nls2.priority 
            AND nls3.featurename = nls2.featurename 

mas este só retorna a versão en...

id|featureName|locale     |priority|text
--+-----------+-----------+--------+----
 1| type      |         en|       1|father
 5| firstName |         en|       1|first name
 7| lastName  |         en|       1|last name

NOTA: atualizarei a pergunta dependendo das respostas.

O principal problema parece que eu preciso de group byum column, mas o grupo também precisa de um order by?

mysql group-by
  • 2 respostas
  • 5629 Views
Martin Hope
lumo
Asked: 2014-09-23 04:51:46 +0800 CST

Alternativas para uma consulta LEFT OUTER JOIN

  • 2

Problema

Eu tenho uma instrução SQL com um LEFT OUTER JOINque funciona bem em nosso arquivo Microsoft SQL Server. Meu problema é que tenho que ser compatível H2 Databasee este tem um bug com OUTER JOINS.


Consulta SQL

SELECT *
FROM tSysNls
WHERE nlsGuid IN
    ( SELECT nlsGuid = CASE 
    WHEN de_AT.nlsGuid IS NOT NULL THEN de_AT.nlsGuid 
    WHEN de.nlsGuid IS NOT NULL THEN de.nlsGuid ELSE en.nlsGuid 
    END
    FROM tSysNLS en
    LEFT OUTER JOIN tSysNLS de ON en.nlsAttribute=de.nlsAttribute
        AND en.nlsClazz=de.nlsClazz
        AND de.nlsLocale= 'de'
    LEFT OUTER JOIN tSysNLS de_AT ON de.nlsAttribute=de_AT.nlsAttribute
        AND de.nlsClazz=de_AT.nlsClazz
        AND de_AT.nlsLocale= 'de_AT'
    WHERE en.nlsLocale= 'en'
        AND en.nlsClazz= 'Contact'
        AND en.nlsAttribute= 'firstName')

Mesa

CREATE TABLE tsysNLS
(
   nlsGuid           nvarchar(207)   NOT NULL,
   nlsLocale         nvarchar(5)     NOT NULL,
   nlsClazz          nvarchar(100)   NOT NULL,
   nlsAttribute      nvarchar(100)   NOT NULL,
   nlsDisplayName    nvarchar(255)   NOT NULL,
   nlsOldname        nvarchar(50),
   nlsDescription    nvarchar(255),
   nlsShapefilename  nvarchar(10)
);

dados de exemplo

INSERT INTO tsysNLS(nlsGuid, nlsLocale, nlsClazz, nlsAttribute, nlsDisplayName, nlsOldname, nlsDescription, nlsShapefilename)
VALUES(N'Contact.firstName.en', N'en', N'Contact', N'firstName', N'Name - First Name', N'conFirstName', N'Name - First Name', NULL);
INSERT INTO tsysNLS(nlsGuid, nlsLocale, nlsClazz, nlsAttribute, nlsDisplayName, nlsOldname, nlsDescription, nlsShapefilename)
VALUES(N'Contact.firstName.de', N'de', N'Contact', N'firstName', N'Vorname', N'conFirstName', NULL, N'ConNamVor');
INSERT INTO tsysNLS(nlsGuid, nlsLocale, nlsClazz, nlsAttribute, nlsDisplayName, nlsOldname, nlsDescription, nlsShapefilename)
VALUES(N'Contact.firstName.de_AT', N'de_AT', N'Contact', N'firstName', N'Vorname (AT)', N'conFirstName', NULL, N'ConNamVor');
sql-server join
  • 3 respostas
  • 12808 Views

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