小编Rol*_*DBA的帖子

具有多列和不同排序选项的 CASE ORDER BY

我试图CASE ORDER BY在存储过程中使用 T-SQL,在其中我将 @OrderBy 参数作为 TINYINT 传递。

  • @Orderby = 1 Then Date column should be ASC
  • @Orderby = 2 Then Date column should be DESC

我的问题是:当我为该参数传递 2 时,如何让日期列对 desc 进行排序,并在同一个 CASE ORDER BY 语句中将字符串列按 asc 排序?

这就是我现在所拥有的 CASE ORDER BY

    ORDER BY 
    CASE WHEN @OrderBy = 1 THEN CONVERT(NVARCHAR(30) , ccd.CertEndDate) + tp.LastName + tp.FirstName END ,
    CASE WHEN @OrderBy = 2 THEN CONVERT(NVARCHAR(30) , ccd.CertEndDate) + tp.LastName + tp.FirstName END DESC
Run Code Online (Sandbox Code Playgroud)

此代码解析并返回一个结果集没有错误,但第二个 CASE ORDER BY 都是 …

stored-procedures order-by t-sql case

6
推荐指数
2
解决办法
4万
查看次数

如何在数据库中保留很长的问题和答案?

我正在计划我的数据库设计为 3 类不同的客户(目前至少 3 个)提供 3 组多个问题,每组包含大约。100 个问题,等待他们的答案被保存在数据库中。

这些问题都在必填的问卷中,这对我的工作来说是非常重要的材料,然后将它们全部作为电子邮件发送给我自己是不可替代的。我不是这个领域的专家。我不确定存储、检索和管理它们的最佳方法是什么。

请查看我的数据库设计和建议以获得更好的方法。

表格:问题

  • 设置名称
  • 第一季度
  • Q2
  • Q3
  • ...

表:问卷

  • 顾客ID
  • 设置名称
  • A1
  • A2
  • A3
  • ...

我有3个主要问题:

  1. 如何根据客户资料在PHP页面上显示每组问答?
  2. 问题需要显示在网页上,如果是手动,文本显示,如果我决定移除、编辑或删除一些问题,这对我来说将是一项耗时的工作。你会推荐什么方式?
  3. QUESTIONS 表中的所有问题(Q1、Q2 和...)都需要与 QUESTIONNAIRE 表中的答案(A1、A2 和...)完全映射,有没有更好的方法?

database-design

6
推荐指数
1
解决办法
3032
查看次数

mysql 复制在什么情况下可能会中断?

我在主/从配置模式下运行 mysql 服务器。有多个从主从复制。它们工作正常并且它们的复制状态受到监控。

其中一名奴隶为特殊目的服务。开发人员给了我一组要在从属 A 上复制的从属数据库上运行的更新查询。

他们正在更新数据库表中的旧记录(修改大量记录的列数据)。

问题

  • 有什么办法可以弄清楚给定的查询是否会破坏复制?
  • 对于将来,我如何确定查询是否会破坏复制?

mysql replication

6
推荐指数
1
解决办法
7610
查看次数

使用子查询和 IN 子句查询性能

我正在尝试从历史表中为多个设备(唯一序列号)选择一系列数据,并想知道为什么以下查询的时间差异如此之大:

基本上我试图使用 IN 子句来指示我想要获取数据的项目。如果我对 IN 子句中的项目进行“硬编码”,则查询速度很快,如果我使用子查询或连接来选择项目,则性能很差。

此查询在 0.15 秒内完成并返回 7382 行。

SELECT `readings`.* FROM `readings`
WHERE
  (SerialNumber IN ('091146000121', *snip 25*, '091146000556'))
AND (readings.time >= 1325404800)
AND (readings.time < 1326317400)
ORDER BY `time` ASC
Run Code Online (Sandbox Code Playgroud)

使用子查询重写以获取序列号的相同查询需要 30 多秒,并且似乎大部分时间都处于 Preparing 状态。它返回与第一个查询相同的数据。

SELECT `readings`.* FROM `readings`
WHERE
  (SerialNumber IN (SELECT `boards`.`id` AS `SerialNumber` FROM `boards` WHERE (siteId = '1')))
AND (readings.time >= 1325404800)
AND (readings.time < 1326317400)
ORDER BY `time` ASC
Run Code Online (Sandbox Code Playgroud)

子查询返回与第一个查询中相同的值,但如前所述,这需要更长的时间来运行。 它们在功能上不是等效的吗?

这是两个查询的解释:

+----+-------------+----------+-------+---------------+---------+---------+------+------+-----------------------------+
| id | select_type | table    | type …
Run Code Online (Sandbox Code Playgroud)

mysql performance subquery

6
推荐指数
1
解决办法
1万
查看次数

有没有办法向 MySQL 的查询优化器提示应该首先完成哪些约束?

这是我当前的查询:

SELECT BusinessID as ID,  
  111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from
(
    SELECT *
    FROM
      tableauxiliary
    WHERE
      MBRContains(
    GeomFromText (
        'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
        ),
        Latlong)=1  
    AND Prominent >15 
) AS TA

    Having Distance <= 18238
    ORDER BY
  Distance
LIMIT
  0, 45
Run Code Online (Sandbox Code Playgroud)

请注意,他们我使用了子查询。它使用子查询的原因是因为我想要

      MBRContains(
    GeomFromText (
        'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
        ),
        Latlong)=1   
Run Code Online (Sandbox Code Playgroud)

首先要完成。这将查询时间从 19 秒减少到 0.9 秒。

有没有办法提示mysql查询优化器,这样我就不需要使用子查询

更新:

我试过:

SELECT BusinessID as ID,  
  111151.29341326*SQRT(pow(-6.186751-X(LatLong),2)+pow(106.772835-Y(LatLong),2)*0.98838574205337) AS Distance from tableauxiliary 
USE Index (LatLong_2,FullTextSearch)
WHERE
    MBRContains(
    GeomFromText (
        'MULTIPOINT(-6.1934985598076 106.76604791159,-6.1800034401924 106.77962208841)'
        ),
        Latlong)  
    AND Prominent >15 …
Run Code Online (Sandbox Code Playgroud)

mysql optimization subquery

6
推荐指数
2
解决办法
1990
查看次数

mysql备份策略?

我们有一个 innodb mysql 数据库,所以我们迷失了许多不同的 mysql 备份策略。有人谈论mysqldump,有人谈论第三方工具。有些表我们还计划运行分区。有什么好工具可以帮助完成这项任务?

mysql innodb mysqldump backup

6
推荐指数
1
解决办法
6900
查看次数

如何使用不同的 tmp 目录与 MySQL 进行 INTO OUTFILE 选择?

我正在尝试使用 SELECT ... INTO OUTFILE 查询转储一个大表(40GB,600,000 行)。我想使用它,因为我希望我的结果以特定方式排序(因此 mysqldump 不够好)。

问题是,我收到错误代码 28。我很确定这是因为默认 /tmp 位置的磁盘空间不足。如果我可以在运行时指定用于 tmp 的位置,我在其他地方的磁盘上有足够的空间。

我发现我可以通过修改 my.cnf 来更改 tmpdir,但是我没有足够的服务器权限来修改它或重新启动 mysqld。

这里的解决方案是什么?

编辑:一些答案建议使用 mysql -e。我可能不得不走这条路并对我的文件进行后处理。我想使用 SELECT ... INTO OUTFILE 的原因是因为我想

fields   terminated by '\t'
         escaped by '\\'
lines    terminated by '\r\n' ;
Run Code Online (Sandbox Code Playgroud)

mysql mysqldump backup

6
推荐指数
2
解决办法
1万
查看次数

面对有点乱序的插入,innodb 的碎片有多严重?

假设 (field1, field2) 上有一个复合主键

另外,让 X 是一组理论的 n 个数字

插入看起来像这样:

INSERT INTO table(field1, field2)
VALUES([a number picked at random from X], [an incrementing number]);
Run Code Online (Sandbox Code Playgroud)

每插入 m 个数字,从 X 中随机删除一个数字,并随机添加另一个数字。

假设 n=1000 和 m=500。换句话说,每插入 500 次,集合 X 中的一个元素就会改变,但集合 X 总是有 1000 个元素。

B+树会变得多么支离破碎?

mysql innodb

6
推荐指数
1
解决办法
1661
查看次数

如何从数据库转储单个存储过程

我需要创建一个转储文件,其中包含来自数据库的单个存储过程,而不是所有例程。

我试过这样的事情:

mysqldump -u root -pssmart --skip-triggers --no-create-info --no-data \
    --no-create-db --skip-opt test_fshop SP_ITEM_SALES_REPORT -R \
    > test_fshop_routines.sql 
Run Code Online (Sandbox Code Playgroud)

test_fshop是我的数据库名称,SP_ITEM_SALES是我的 SP。我想要我的 SP 作为 .sql 文件。

mysql mysqldump backup stored-procedures

6
推荐指数
1
解决办法
2万
查看次数

未为 Amazon MySQL RDS 中的主用户定义超级权限

我在亚太(新加坡)地区的亚马逊 rds 上创建了一个中型实例。我已经用主密码创建了我的主用户。它在我本地 PC 上安装的工作台上工作/连接正常。当我要在该实例上创建函数时,它会显示以下错误

错误 1418:此函数的声明中没有 DETERMINISTIC、NO SQL 或 READS SQL DATA,并且启用了二进制日志记录(您可能希望使用不太安全的 log_bin_trust_function_creators 变量)

在我的实例中,我的变量 (log_bin_trust_function_creators) 显示为 OFF。现在,当我使用变量进行更改时

SET GLOBAL log_bin_trust_function_creators = 1;
Run Code Online (Sandbox Code Playgroud)

它给了我另一个错误

错误代码:1227。访问被拒绝;您需要(至少其中之一)此操作的 SUPER 权限

我不知道如何解决这个错误。

有人可以帮忙吗???

mysql mysql-5.5 amazon-rds

6
推荐指数
1
解决办法
2万
查看次数