AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-203092

Elikill58's questions

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

如何优化使用不同静态字符串的多个 WHEN?

  • 5

我有一张这样的桌子:

ID 笔记 客户
1
有多行的长注释
客户:姓名
无效的
2 附注:有多行
客户:姓名
无效的
3 第三条注释有多行
客户:姓名
行
无效的
4 线路:
客户:姓名
线
无效的
5 B 行
B : 行
客户 : 姓名
行
其他
无效的

我想从“注释”列中提取客户信息,然后仅使用一个 SQL 查询将其放在“客户”列中。

我给出了一些代表我实际拥有的数千行代码的示例。我首先进行了以下查询:

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)

由于存在重复的代码(WHEN部分),如果我有另一种添加方法,则很难阅读并且不太好。

我有:至少有 6 种编写客户端的方法。我想优化这部分:

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

是“通用的”,但我不知道怎么做,因为我不懂编程语言。在 php 中,这很容易,但我不能使用编程语言,我只能使用一个查询。

有一件事非常有用:每行只有一种方法可以编写客户端。它始终只包含一个。

我该怎么办?

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

为什么它从请求的另一个月份中选择日期?

  • 5

我有一个表存储一些事件的开始时间和结束时间。我想在这个表中搜索所有事件,甚至是在特定日期发生的事情。

这是示例数据:

ID 开始日期 结束日期 姓名
1 2024-04-18 13:30:45 2024-04-18 15:30:45 18-04
2 2024-04-14 13:30:45 2024-04-18 15:30:45 18-04
3 2024-04-15 13:30:45 2024-04-15 15:30:45 15-04
4 2024-04-14 13:30:45 2024-04-14 15:30:45 14-04
5 2024-04-12 13:30:45 2024-04-12 15:30:45 12-04
6 2024-03-18 13:30:45 2024-03-18 15:30:45 18-03
7 2024-03-15 13:30:45 2024-03-16 15:30:45 15-03
8 2024-03-14 13:30:45 2024-03-15 15:30:45 14-03
9 2024-03-12 13:30:45 2024-03-13 15:30:45 12-03

如果我想要 14/04 的数据,这是例外的输出:

ID 开始日期 结束日期 姓名
2 2024-04-14 13:30:45 2024-04-18 15:30:45 18-04
4 2024-04-14 13:30:45 2024-04-14 15:30:45 14-04

这是我的查询:

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

但这是我的实际输出:

ID 开始日期 结束日期 姓名
2 2024-04-14 13:30:45 2024-04-18 15:30:45 18-04
4 2024-04-14 13:30:45 2024-04-14 15:30:45 14-04
8 2024-03-14 13:30:45 2024-03-15 15:30:45 14-03

为什么我收到的线路是正确的一天,但却是另一个月的?

我做了一个Db Fiddle来展示这个问题。

我该如何修复它?

注意:我使用的是 MariaDB 10.11.4。

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

求和列并删除行总和

  • 5

我想对按名称和服务器分组的“金额”列求和,并删除重复的行。我希望保存这些更改(不仅仅是一个查询)。

例如,这里是开始数据:

ID 服务器 姓名 数量
1 20 A 1
2 20 A 1
3 30 乙 2
4 20 乙 1
5 20 A 1

这就是我想要的:

ID 服务器 姓名 数量
1 20 A 3
3 30 乙 2
4 20 乙 1

实际上,我可以这样做:

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

但是,我只会获得金额列的值。它不会更新表,也不会删除其他行。

如果我做类似的事情,UPDATE myTable SET amount = (SELECT SUM(amount) as amount FROM myTable WHERE server = myTable.server AND name = myTable.name)它将不起作用,因为我无法选择更新。

那么,我该怎么办呢?

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

为什么制作临时表比多个 WHERE 条件更快?

  • 5

我有一张这样的桌子:

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);

该表包含超过 4000 万行,只有 2k 行设置为活动行,并且每个 ExternalId 仅 3 行。

我想获得所有活动会话以获得精确的ExternalId. 所以,我基本上做了:

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

但是,这需要很多时间(超过 3 秒)。经过一番调查,我发现这个更快:

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

这样,大约需要 0.005 秒。

我想知道为什么制作临时表比使用 2 个参数进行基本 where 检查更快?

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

如何解决 row_number 和多模式的性能问题?

  • 9

在收到如何获得有效排名计数器的答案后 ,我适应了我自己的系统。但是现在,我遇到了性能问题。我所有的请求都非常快(大多数请求不到 0.0005 秒),但是当使用ROW_NUMBER()多个模式时,它需要超过 0.2 秒。

这是一个完整的例子:

模式 1,名为sanctions,有一个名为的表bans,由以下内容组成:

  • id, 自增字段
  • uuid, 带有索引的 varchar
  • 其他内容与问题无关

该表实际有 400 多行。

模式 2,名为stats,有一个名为的表players,由以下内容组成:

  • id, 自增字段
  • uuid, 带有索引的 varchar
  • coins, 双倍的
  • 其他内容与问题无关

该表实际有 2000 多行。

我的完整查询是这样的:

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;

大约需要 0.22 秒。

现在,让我们逐部分检查:

运行时SELECT count(*) FROM arkbans.litebans_bans WHERE uuid = p.uuid(并用p.uuid一个值替换),我从不超过 0.0002 秒。

运行时:

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

大约需要 0.0017 秒。

用ANALYZE钥匙:

在此处输入图像描述

随着ANALYZE FORMAT=JSON:在这里

查询分析:

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

我该如何解决这个性能问题?

注意:这里的“硬币”栏是一个例子。实际上,超过 60 个列将使用此请求。所以像这样为每一列添加索引对我来说不是一个选项(索引太多,值太多)

注意 2:抱歉,不能做 db fiddle,因为它在多个数据库上并且有很多数据。

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

我怎样才能得到一个有效的排名计数器?

  • 5

我正在制作一个耙系统。我想在一个请求中获得线路。

这是我完整示例的数据库小提琴:https://www.db-fiddle.com/f/3Com2wnrhaqfiTKqJSZtft/0

在示例中,使用的 UUID 是36619b04-4fbe-4ba9-8bd6-aaba7df74bb6. 如第一个查询所示,它应该是 4。但是第二个查询返回 2。+1查询中的是从 1 而不是 0 开始排名。该date_created列用于第二次排序(如果值相同,我们根据日期进行检查) . 有了这个系统,它强制拥有一个独特的等级(没有平等)。

实际上,对于第一个请求,我以简单的增量获得了程序中的排名。但是,对于第二个查询,我不能因为我想要可能是第 12502 位的人的排名。

我该如何解决?

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

如何从主查询的子查询返回内容列表?

  • 6

我有一个具有子查询的创建。作为示例,这是一个与我自己的相似的查询。就我个人而言,我在表上有更多的表和更多的参数(例如,子查询有 left join)。我为这个问题简化了它。

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;

我想将SELECT UserId FROM Users WHERE Deleted = false查询放入主表中,因为我多次使用结果。在示例中,我使用了内容 2 次。它仅用于优化。希望它能真正帮助表演。

我试过这样的事情:

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;

但我明白了Subquery returns more than 1 row。我怎样才能让它工作并只运行一次查询?

PS:我没有实际数据,因为即使是我,在检查查询时,也没有准确地寻找数据。

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

如何在窗口规范中允许窗口功能?

  • 2

我正在尝试运行此查询:

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

此查询在 MySQL 上运行良好,但在另一个数据库服务器上,在 MariaDB(版本:)上,10.6.5-MariaDB-1:10.6.5+maria~bionic它因以下错误而失败:

#4016 - Window function is not allowed in window specification

我在 PhPMyAdmin 中搜索了允许窗口功能的选项,但没有找到。

我怎么能允许它?

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

即使我们给出值,也不会抛出默认值错误

  • 0

我的一个产品的用户正在使用MySQL 10.7.3-MariaDB.

这是表创建:

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

当我的产品运行时:

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

它抛出错误:“字段'报告'没有默认值”。

此请求适用于我测试多年的所有 mysql 版本,那么新行为是什么以及如何在不破坏所有其他数据库的情况下修复它?

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

Mysql - 多个数据库的复制

  • 0

我正在尝试用 Mysql 做一个冗余。我正在做大师。我很高兴,因为它适用于一个数据库。当我在表中添加某些内容时,它会添加到第二台服务器的表中。2个数据库不在同一台服务器上。但我想添加其他数据库。

因此,我将其添加到两个服务器:

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

我重新启动了 mysql,但“显示主状态”的结果是相同的(特别是“Binlog_Do_DB”(并且数据库不在两个服务器中)。

mysql linux
  • 2 个回答
  • 1909 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

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

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve