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-203092

Elikill58's questions

Martin Hope
Elikill58
Asked: 2024-08-28 20:08:56 +0800 CST

Como otimizar múltiplos WHEN que estão usando diferentes strings estáticas?

  • 5

Eu tenho uma tabela assim:

Eu ia Observação Cliente
1 Nota longa com
várias linhas
Cliente: Nome
nulo
2 Outra nota que tenha várias linhas
Cliente: Nome
nulo
3 Terceira nota que tem várias linhas
Cliente:
Linha de nome
nulo
4 Linha: A
Cliente:
Linha de nome
nulo
5 Linha B
B: Linha
Cliente: Nome
linha
outros
nulo

Quero extrair informações do cliente da coluna "Nota" para colocá-las na coluna "Cliente" com apenas uma consulta SQL.

Dei alguns exemplos que representam os milhares de linhas reais que tenho. Primeiro fiz esta consulta:

SELECT
    CASE
        WHEN posclient != 0 THEN SUBSTRING(
            Note,
            posclient + LENGTH('Client: '),
            LOCATE('\n', Note, posclient + LENGTH('Client: ')) - (posclient + LENGTH('Client: '))
        )
        WHEN poscustomer != 0 THEN SUBSTRING(
            Note,
            poscustomer + LENGTH('Customer : '),
            LOCATE('\n', Note, poscustomer + LENGTH('Customer : ')) - (poscustomer + LENGTH('Customer : '))
        )
        WHEN poscontact != 0 THEN SUBSTRING(
            Note,
            poscontact + LENGTH('Contact : '),
            LOCATE('\n', Note, poscontact + LENGTH('Contact : ')) - (poscontact + LENGTH('Contact : '))
        )
        ELSE ''
    END AS client,
    Id
FROM (SELECT Id, Note,
        LOCATE('Customer : ', Note) as poscustomer,
        LOCATE('Client: ', Note) as posclient,
        LOCATE('Contact : ', Note) as poscontact
    FROM myTable) x 
WHERE (poscustomer != 0 OR posclient != 0 OR poscontact != 0)

Como há código duplicado (a WHENparte), é difícil de ler e não fica muito bom se eu tiver outra maneira de adicionar.

E eu tenho: há pelo menos 6 maneiras de escrever o cliente. Quero otimizar esta parte:

WHEN poscontact != 0 THEN SUBSTRING(
   Note,
   poscontact + LENGTH('Contact : '),
   LOCATE('\n', Note, poscontact + LENGTH('Contact : ')) - (poscontact + LENGTH('Contact : '))
)

Para ser "genérico", mas não sei como, pois não estou em linguagem de programação. Em php, isso seria fácil, mas não posso usar linguagem de programação, tenho que usar apenas uma consulta.

Uma coisa que pode ser muito útil: há apenas UMA maneira de escrever o cliente para cada linha. Ele sempre conterá apenas um.

Como posso fazer?

query-performance
  • 2 respostas
  • 34 Views
Martin Hope
Elikill58
Asked: 2024-04-18 20:16:35 +0800 CST

Por que está selecionando uma data de outro mês que solicitou uma?

  • 5

Tenho uma tabela que armazena o horário de início e término de alguns eventos. Quero pesquisar nesta tabela todos os eventos que ocorreram em um dia específico.

Aqui estão dados de exemplo:

Eu ia Data de início Data final Nome
1 18/04/2024 13:30:45 18/04/2024 15:30:45 18-04
2 14/04/2024 13:30:45 18/04/2024 15:30:45 18-04
3 15/04/2024 13:30:45 15/04/2024 15:30:45 15-04
4 14/04/2024 13:30:45 14/04/2024 15:30:45 14-04
5 12/04/2024 13:30:45 12/04/2024 15:30:45 12-04
6 18/03/2024 13:30:45 18/03/2024 15:30:45 18-03
7 15/03/2024 13:30:45 16/03/2024 15:30:45 15-03
8 14/03/2024 13:30:45 15/03/2024 15:30:45 14-03
9 12/03/2024 13:30:45 13/03/2024 15:30:45 12-03

Se eu quiser dados para 14/04, esta é a saída excetuada:

Eu ia Data de início Data final Nome
2 14/04/2024 13:30:45 18/04/2024 15:30:45 18-04
4 14/04/2024 13:30:45 14/04/2024 15:30:45 14-04

Aqui está minha consulta:

SELECT * FROM content WHERE
    DATE_FORMAT(dateBegin, '%d/%m/%Y') <= '14/04/2024'
AND
    DATE_FORMAT(dateEnd, '%d/%m/%Y') >= '14/04/2024'

Mas aqui está minha saída real:

Eu ia Data de início Data final Nome
2 14/04/2024 13:30:45 18/04/2024 15:30:45 18-04
4 14/04/2024 13:30:45 14/04/2024 15:30:45 14-04
8 14/03/2024 13:30:45 15/03/2024 15:30:45 14-03

Por que recebo uma linha do dia certo, mas de outro mês?

Fiz um Db Fiddle para mostrar esse problema.

Como posso consertar isso?

Nota: estou usando o MariaDB 10.11.4.

mariadb
  • 1 respostas
  • 22 Views
Martin Hope
Elikill58
Asked: 2023-09-20 16:45:40 +0800 CST

Somar coluna e remover soma de linhas

  • 5

Quero somar a coluna "quantidade" agrupada por nome e servidor e remover linhas duplicadas. Quero que essas alterações sejam salvas (não apenas com uma consulta).

Por exemplo, aqui estão os dados iniciais:

Eu ia servidor nome quantia
1 20 a 1
2 20 a 1
3 30 b 2
4 20 b 1
5 20 a 1

E aqui está o que eu quero:

Eu ia servidor nome quantia
1 20 a 3
3 30 b 2
4 20 b 1

Na verdade, posso fazer isso com:

SELECT SUM(amount) as amount FROM myTable GROUP BY server, name;

Porém, obterei apenas o valor da coluna de valor. Não atualizará a tabela e nem removerá outras linhas.

Se eu fizer algo assim, UPDATE myTable SET amount = (SELECT SUM(amount) as amount FROM myTable WHERE server = myTable.server AND name = myTable.name)não funcionará, pois não posso selecionar uma atualização.

Então, como posso fazer?

mysql
  • 1 respostas
  • 15 Views
Martin Hope
Elikill58
Asked: 2023-04-27 14:56:30 +0800 CST

Por que criar uma tabela temporária é mais rápido do que várias condições WHERE?

  • 5

Eu tenho uma tabela assim:

CREATE TABLE Sessions (
  SessionId int(11) NOT NULL AUTO_INCREMENT,
  ExternalId int(11) NOT NULL,
  Active bit(1) NOT NULL DEFAULT b'0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3;

ALTER TABLE Sessions
  ADD PRIMARY KEY (SessionId),
  ADD KEY ExternalId (ExternalId),
  ADD KEY Active (Active);

Esta tabela contém mais de 40 milhões de linhas, com apenas 2 mil linhas definidas como ativas e apenas 3 linhas por ExternalId.

Eu quero obter todas as sessões ativas para um arquivo ExternalId. Então, basicamente fiz:

SELECT * FROM Sessions WHERE Active = 1 AND ExternalId = myId;

Mas, leva muito tempo (mais de 3 segundos). Depois de alguma investigação, descobri que este é mais rápido:

SELECT * FROM (SELECT * FROM Sessions WHERE Active = 1) x WHERE x.ExternalId = myId;

Com isso, leva cerca de 0,005 segundos.

Gostaria de saber porque fazer uma tabela temporária é mais rápido que uma basic onde checar com 2 params?

performance
  • 2 respostas
  • 37 Views
Martin Hope
Elikill58
Asked: 2023-04-19 04:15:11 +0800 CST

Como corrigir o problema de desempenho com row_number e vários esquemas?

  • 9

Depois de receber a resposta para Como posso obter um contador de classificação válido? , adaptei ao meu próprio sistema. Mas agora, eu tenho um problema de desempenho. Todas as minhas solicitações são muito rápidas (menos de 0,0005s para a maioria delas), mas ao usar ROW_NUMBER()com vários esquemas, demora mais de 0,2s.

Aqui está um exemplo completo:

Esquema 1 , nomeado sanctions, com uma tabela nomeada banse composta por:

  • id, campo de incremento automático
  • uuid, varchar com índice
  • outros conteúdos não vinculados à pergunta

Esta tabela atual tem mais de 400 linhas.

Esquema 2 , denominado stats, com uma tabela nomeada playerse composta por:

  • id, campo de incremento automático
  • uuid, varchar com índice
  • coins, dobro
  • outros conteúdos não vinculados à pergunta

Esta tabela atual tem mais de 2000 linhas.

Minha consulta completa é assim :

SELECT
   uuid,
   (SELECT count(*) FROM sanctions.bans WHERE uuid = p.uuid) as nb,
   row_number() OVER (order by coins DESC) counter
FROM stats.players p;

Demora cerca de 0,22s.

Agora, vamos verificar parte por parte :

Ao executar SELECT count(*) FROM arkbans.litebans_bans WHERE uuid = p.uuid(e substituindo p.uuidpor um valor), nunca vou além de 0,0002s.

Ao executar:

SELECT
   uuid,
   row_number() OVER (order by coins DESC) counter
FROM stats.players p;

Demora cerca de 0,0017s.

Com ANALYZEchave:

insira a descrição da imagem aqui

Com ANALYZE FORMAT=JSON: aqui

Consulta analisada:

WITH Bans AS
(
    SELECT uuid, COUNT(*) AS BanCount
    FROM sanctions.bans
    GROUP BY uuid
)
 
SELECT
   p.uuid,
   COUNT(b.BanCount) as nb,
   row_number() OVER (order by MAX(p.coins) DESC) counter
FROM stats.players p
LEFT JOIN Bans b ON p.uuid = b.uuid

Como posso corrigir esse problema de desempenho?

Nota: a coluna "moedas" aqui é um exemplo. Na realidade, mais de 60 colunas usarão essa solicitação. Portanto, adicionar índice para cada coluna como esta não é uma opção para mim (muitos índices, com valores muito diferentes)

Nota 2: Não é possível fazer um db fiddle, pois está em vários bancos de dados e com muitos dados, desculpe.

query-performance
  • 1 respostas
  • 41 Views
Martin Hope
Elikill58
Asked: 2023-04-14 04:46:54 +0800 CST

Como posso obter um contador de classificação válido?

  • 5

Estou fazendo um sistema de raking. Eu quero obter a linha em um pedido.

Aqui está um violino de banco de dados do meu exemplo completo: https://www.db-fiddle.com/f/3Com2wnrhaqfiTKqJSZtft/0

No exemplo, o UUID usado é 36619b04-4fbe-4ba9-8bd6-aaba7df74bb6. Como a primeira consulta mostra, deve ser 4. Mas a segunda consulta retorna 2. A +1consulta é para começar a classificação em 1 em vez de 0. A date_createdcoluna é para uma segunda ordem (se for o mesmo valor, verificamos de acordo com a data) . Com este sistema, obriga a ter uma classificação única (não há igualdade).

Na verdade, com a primeira solicitação, obtenho a classificação em meu programa com um simples incremento. Mas, para a segunda consulta, não posso, pois quero o posto de alguém que poderia ser o 12502º.

Como posso consertar isso?

mariadb
  • 1 respostas
  • 48 Views
Martin Hope
Elikill58
Asked: 2023-04-05 21:06:44 +0800 CST

Como retornar a lista de conteúdo da subconsulta para a consulta principal?

  • 6

Eu tenho uma criação que tem uma subconsulta. Para mostrar como exemplo, aqui está uma consulta que tem semelhança com a minha. Pessoalmente, tenho mais tabelas e mais argumentos na tabela (a subconsulta saiu da junção, por exemplo). Eu simplifiquei para a pergunta.

SELECT
   Content,
   CASE 
      WHEN S.User IN (SELECT UserId FROM Users WHERE Deleted = false) AND S.Permission Like '%ADMIN%' THEN 'Admin'
      ELSE 'Basic'
   END AS UserType,
   CASE 
      WHEN S.User IN (SELECT UserId FROM Users WHERE Deleted = false) THEN 'Here'
      ELSE 'Not'
   END AS Exist
FROM (
   SELECT *
   FROM MyTable
   WHERE Deleted = false
) as S;

Quero colocar a SELECT UserId FROM Users WHERE Deleted = falseconsulta na tabela principal, pois estou usando o resultado várias vezes. No exemplo, estou usando o conteúdo 2 vezes. É apenas para otimização. Espero que possa realmente ajudar as performances.

Eu tentei algo assim:

SELECT
   Content,
   CASE 
      WHEN S.User IN (AvailableUsers) THEN 'Here'
      ELSE 'Not'
   END AS Exist,
   CASE 
      WHEN S.User IN (AvailableUsers) AND S.Permission Like '%ADMIN%' THEN 'Admin'
      ELSE 'Basic'
   END AS UserType
FROM (
   SELECT *, (SELECT UserId FROM Users WHERE Deleted = false) as AvailableUsers
   FROM MyTable
   WHERE Deleted = false
) as S;

Mas eu entendo Subquery returns more than 1 row. Como posso fazer como funciona e executar a consulta apenas uma vez?

PS: Não tenho dados reais porque até eu, ao verificar a consulta, não estava procurando exatamente os dados.

mariadb
  • 1 respostas
  • 43 Views
Martin Hope
Elikill58
Asked: 2022-09-01 02:34:10 +0800 CST

Como permitir a função de janela na especificação da janela?

  • 2

Estou tentando executar esta consulta:

SELECT uuid, 
       brainffa - LAG(brainffa, 1) OVER (ORDER BY brainffa) as brainffa 
FROM time_played 
WHERE automatic = 1 AND name LIKE 'all%' 
ORDER BY uuid DESC LIMIT 15

Esta consulta funciona bem com o MySQL, mas neste outro servidor db, no MariaDB (versão: 10.6.5-MariaDB-1:10.6.5+maria~bionic) falhou com este erro:

#4016 - Window function is not allowed in window specification

Procurei no PhPMyAdmin uma opção para permitir a função de janela, mas não encontrei.

Como posso permitir?

mariadb mariadb-10.6
  • 1 respostas
  • 31 Views
Martin Hope
Elikill58
Asked: 2022-07-19 10:55:24 +0800 CST

Não jogue nenhum erro de valor padrão, mesmo se dermos valor

  • 0

Um usuário de um dos meus produtos está usando MySQL 10.7.3-MariaDB.

Esta é a criação da tabela:

CREATE TABLE IF NOT EXISTS negativity_accounts
(
    id CHAR(36) NOT NULL PRIMARY KEY,
    reports VARCHAR(1024) NOT NULL
);

Quando meu produto é executado:

REPLACE INTO table (id, reports) VALUES ('my-id', '');

Ele lança erro: "O campo 'relatórios' não tem um valor padrão".

Esta solicitação funciona com todas as versões do mysql que testei por vários anos, então qual é o novo comportamento e como posso corrigi-lo sem quebrar todos os outros bancos de dados?

mariadb
  • 1 respostas
  • 25 Views
Martin Hope
Elikill58
Asked: 2020-03-11 13:46:37 +0800 CST

Mysql - Replicação de vários bancos de dados

  • 0

Estou tentando fazer uma redundância com o Mysql. Estou fazendo mestre-mestre. Estou muito feliz porque funciona com um banco de dados. Quando eu adiciono algo em uma mesa, é adicionado na mesa do segundo servidor. Os 2 DB NÃO estão no mesmo servidor. mas eu quero adicionar outro banco de dados.

Então, eu adiciono isso aos dois servidores:

replicate-do-db = other
binlog-do-db = other

Reiniciei o mysql, mas o resultado de "show master status" é o mesmo (especialmente "Binlog_Do_DB" (e o banco de dados não está nos dois servidores).

mysql linux
  • 2 respostas
  • 1909 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