- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
问题
对于下面提供的所有内容、所有示例和数据,是否有其他方法可以通过执行不同表的UNION
来获得预期结果?
我的麻烦
基本上我需要有条件逻辑来:
如果在定义的时间段内找到记录,则从表中获取所有记录(多个)
如果在定义的时间段内找不到记录,则从表中获取自
规定时间段
台阶
只需创建表并插入下面列出的数据和该逻辑,然后运行我在每个示例中提供的每个查询,就可以轻松模拟我所指的内容。
上下文和说明
也许用一个temp/memory表代替@Now~
变量,在相关的temp表中有TRUE
条件,或者用一些详细的(或者对某些简单的)数据表UNION
方法?
我指的是下面的一个“定义的时间段”,或者是意思相近的词,通过这些词,我指的是一个特定的开始时间和一个特定的结束时间,以及这两点之间的所有时间,这就是我使用这个词时所说的。
有一个报告系统可以生成这些开始和结束时间框架,我已经在一个存储过程中获得了逻辑,这个存储过程被调用,日期时间被传入。
我只提供了存储过程的一部分,并对其进行了一些选择查询,以给出问题的示例以及预期或需要的结果。
创建数据
使用下面的命令,您可以在MySQL数据库中创建三个表,这也将填充我在运行的查询中使用的数据,以便在每个查询的下面显示结果,这样您就可以跟踪并使用数据,甚至可以帮助我找到解决方案或一两个指针。
注意:在确定将MySQL实例上的JOIN
更改为实际的DB名称或模式之前。
USE <DBName>;
CREATE TABLE `ponumber` (
`TimeStr` datetime NOT NULL,
`Value` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeStr`));
CREATE TABLE `batch_number` (
`TimeStr` datetime NOT NULL,
`Value` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeStr`));
CREATE TABLE `batchweight` (
`TimeStr` datetime NOT NULL,
`Value` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeStr`));
INSERT INTO `PONumber` (`TimeStr`,`Value`) VALUES ('2017-09-28 10:47:55',0);
INSERT INTO `PONumber` (`TimeStr`,`Value`) VALUES ('2017-09-28 06:26:07',1217911);
INSERT INTO `PONumber` (`TimeStr`,`Value`) VALUES ('2017-09-28 05:24:18',1217906);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-29 12:46:18',5522);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-29 12:25:33',5521);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-29 11:44:45',5520);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-28 06:26:05',5519);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-28 05:22:58',5518);
INSERT INTO `batchweight` (`TimeStr`,`Value`) VALUES ('2017-09-29 12:46:19',38985);
INSERT INTO `batchweight` (`TimeStr`,`Value`) VALUES ('2017-09-28 06:26:07',38985);
INSERT INTO `batchweight` (`TimeStr`,`Value`) VALUES ('2017-09-28 05:23:03',31002);
USE <DBName>;
SET @bStartTime = '2017-09-29 11:10:00';
SET @bEndTime = '2017-09-29 12:48:00';
SELECT TimeStr, CONCAT('Set Load Number: ',Value) AS Value
FROM ponumber
WHERE TimeStr BETWEEN @bStartTime AND @bEndTime
UNION
SELECT TimeStr, CONCAT('Set Batch Number: ',Value) AS Value
FROM batch_number
WHERE TimeStr BETWEEN @bStartTime AND @bEndTime
UNION
SELECT TimeStr,
CONCAT('Batch Weight: ',Value) AS Value
FROM batchweight
WHERE TimeStr BETWEEN @bStartTime AND @bEndTime
ORDER BY TimeStr;
<DBName>
是因为
Set Load Number
表中没有来自定义时间段的
PONumber
和
@bStartTime
变量定义的时间的记录。
@bEndTime
表中没有数据记录,那么结果应该列出该表中的最新记录,甚至那些不在定义的时间段内的记录,因此我构建了查询2。
USE <DBName>;
SET @bStartTime = '2017-09-29 11:10:00';
SET @bEndTime = '2017-09-29 12:48:00';
SET @LastPONumber = (SELECT Value FROM PONumber ORDER BY TimeStr DESC LIMIT 1);
SET @NowPONumber = (SELECT Value FROM PONumber WHERE TimeStr BETWEEN @bStartTime AND @bEndTime ORDER BY TimeStr DESC LIMIT 1);
SET @LastPONumTimeStr = (SELECT TimeStr FROM PONumber ORDER BY TimeStr DESC LIMIT 1);
SET @NowPONumTimeStr = (SELECT TimeStr FROM PONumber WHERE TimeStr BETWEEN @bStartTime AND @bEndTime ORDER BY TimeStr DESC LIMIT 1);
SELECT DISTINCT TimeStr, Value FROM
(SELECT
CASE
WHEN TimeStr = 1 THEN
(SELECT @NowPONumTimeStr AS TimeStr)
ELSE
(SELECT @LastPONumTimeStr AS TimeStr)
END AS TimeStr,
CASE
WHEN Value = 1 THEN
(SELECT (CONCAT('Set Load Number: ',@NowPONumber)) AS Value)
ELSE
(SELECT (CONCAT('Set Load Number: ',@LastPONumber)) AS Value)
END AS Value
FROM PONumber) AS X
UNION
SELECT TimeStr, CONCAT('Set Batch Number: ',Value) AS Value
FROM batch_number
WHERE TimeStr BETWEEN @bStartTime AND @bEndTime
UNION
SELECT TimeStr,
CONCAT('Batch Weight: ',Value) AS Value
FROM batchweight
WHERE TimeStr BETWEEN @bStartTime AND @bEndTime
ORDER BY TimeStr;
PONumber
、
@LastPONumber
、
@NowPONumber
和
@LastPONumTimeStr
变量的地方,根据使用
@NowPONumTimeStr
表达式的条件,使用
SELECT
和
ORDER BY DESC
将这些值设置为
LIMIT 1
查询结果。
CASE WHEN
表记录,因为在定义的时间段之间找不到任何记录,所以这允许它在定义的时间段之外进一步返回。
PONumber
表中没有数据记录,则需要列出最近的记录,就像在查询2中对
Batch_Number
表所做的那样,所以我使用与查询2用于
PONumber
表的相同条件
CASE WHEN
逻辑等来构建查询3。
USE <DBName>;
SET @bStartTime = '2017-09-29 11:10:00';
SET @bEndTime = '2017-09-29 12:48:00';
## - PONumber Table Variables
SET @LastPONumber = (SELECT Value FROM PONumber ORDER BY TimeStr DESC LIMIT 1);
SET @NowPONumber = (SELECT Value FROM PONumber WHERE TimeStr BETWEEN @bStartTime AND @bEndTime ORDER BY TimeStr DESC LIMIT 1);
SET @LastPONumTimeStr = (SELECT TimeStr FROM PONumber ORDER BY TimeStr DESC LIMIT 1);
SET @NowPONumTimeStr = (SELECT TimeStr FROM PONumber WHERE TimeStr BETWEEN @bStartTime AND @bEndTime ORDER BY TimeStr DESC LIMIT 1);
## - Batch_Number Table Variables
SET @LastBatNumber = (SELECT Value FROM Batch_Number ORDER BY TimeStr DESC LIMIT 1);
SET @NowBatNumber = (SELECT Value FROM Batch_Number WHERE TimeStr BETWEEN @bStartTime AND @bEndTime ORDER BY TimeStr DESC LIMIT 1);
SET @LastBatNumTimeStr = (SELECT TimeStr FROM Batch_Number ORDER BY TimeStr DESC LIMIT 1);
SET @NowBatNumTimeStr = (SELECT TimeStr FROM Batch_Number WHERE TimeStr BETWEEN @bStartTime AND @bEndTime ORDER BY TimeStr DESC LIMIT 1);
SELECT DISTINCT TimeStr, Value FROM
(SELECT
CASE
WHEN TimeStr = 1 THEN
(SELECT @NowPONumTimeStr AS TimeStr)
ELSE
(SELECT @LastPONumTimeStr AS TimeStr)
END AS TimeStr,
CASE
WHEN Value = 1 THEN
(SELECT (CONCAT('Set Load Number: ',@NowPONumber)) AS Value)
ELSE
(SELECT (CONCAT('Set Load Number: ',@LastPONumber)) AS Value)
END AS Value
FROM PONumber) AS X
UNION
SELECT DISTINCT TimeStr, Value FROM
(SELECT
CASE
WHEN TimeStr = 1 THEN
(SELECT @NowBatNumTimeStr AS TimeStr)
ELSE
(SELECT @LastBatNumTimeStr AS TimeStr)
END AS TimeStr,
CASE
WHEN Value = 1 THEN
(SELECT (CONCAT('Set Batch Number: ',@NowBatNumber)) AS Value)
ELSE
(SELECT (CONCAT('Set Batch Number: ',@LastBatNumber)) AS Value)
END AS Value
FROM Batch_Number) AS X
UNION
SELECT TimeStr,
CONCAT('Batch Weight: ',Value) AS Value
FROM batchweight
WHERE TimeStr BETWEEN @bStartTime AND @bEndTime
ORDER BY TimeStr;
PONumber
表在定义的时间段之间确实有记录时,它只列出最近的一条记录,而不列出查询2结果中显示的其他两个批号值(
Batch_Number
)。这显然是因为
5521, and 5520
查询变量只包含最近的1条记录。
@NowBatNumber
表以及我在查询3中尝试的方式,我希望结果看起来与查询2的结果完全相同,并且仍然使用条件逻辑来显示否则需要什么。
最佳答案
短而简单的问题比长而复杂的问题更容易引起注意这并不是因为我们回答不了,而是因为我们的问题太多,志愿者的时间太少,所以很难证明有足够的时间来阅读大问题。
不过,我认为你的基本要求并不复杂。您需要一种方法来检索属于某个时间范围内的行,或者如果不在该范围内,则提供离该范围最近的行。
在支持ROW_NUMBER()OVER()的数据库中,这非常简单(MySQL 8.x计划支持这一点),但在模拟ROW_NUMBER()之前,可以使用变量和有序子查询。
您可以在SQL Fiddle试用此解决方案
MySQL 5.6模式设置:
CREATE TABLE `ponumber` (
`TimeStr` datetime NOT NULL,
`Value` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeStr`));
INSERT INTO `PONumber` (`TimeStr`,`Value`) VALUES ('2017-09-28 10:47:55',0);
INSERT INTO `PONumber` (`TimeStr`,`Value`) VALUES ('2017-09-28 06:26:07',1217911);
INSERT INTO `PONumber` (`TimeStr`,`Value`) VALUES ('2017-09-28 05:24:18',1217906);
CREATE TABLE `batch_number` (
`TimeStr` datetime NOT NULL,
`Value` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeStr`));
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-29 12:46:18',5522);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-29 12:25:33',5521);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-29 11:44:45',5520);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-28 06:26:05',5519);
INSERT INTO `batch_number` (`TimeStr`,`Value`) VALUES ('2017-09-28 05:22:58',5518);
CREATE TABLE `batchweight` (
`TimeStr` datetime NOT NULL,
`Value` int(11) NOT NULL,
UNIQUE KEY `uk_Times` (`TimeStr`));
INSERT INTO `batchweight` (`TimeStr`,`Value`) VALUES ('2017-09-29 12:46:19',38985);
INSERT INTO `batchweight` (`TimeStr`,`Value`) VALUES ('2017-09-28 06:26:07',38985);
INSERT INTO `batchweight` (`TimeStr`,`Value`) VALUES ('2017-09-28 05:23:03',31002);
SET @bStartTime := '2017-09-29 11:10:00'
SET @bEndTime := '2017-09-29 12:48:00'
SELECT
SrcTable, TimeStr, Value
FROM (
SELECT
@row_num :=IF( @prev_value=u.SrcTable, @row_num + 1 ,1) AS RowNumber
, u.*
, @prev_value := u.SrcTable
FROM (
select 'ponumber' SrcTable , TimeStr, `Value`
from ponumber
union all
select 'batch_number' SrcTable , TimeStr, `Value`
from batch_number
union all
select 'batchweight' SrcTable , TimeStr, `Value`
from batchweight
) u
CROSS JOIN (SELECT @row_num := 1, @prev_value :='') vars
ORDER BY SrcTable, TimeStr DESC
) d
WHERE (d.TimeStr between @bStartTime and @bEndTime)
OR (TimeStr < @bStartTime AND RowNumber = 1)
UNION
,而是使用了
UNION ALL
。在性能上有很大的差异,应该学会根据需要使用每一个。如果使用
UNION
也不要使用
select distinct
,因为你只是在浪费精力。
| SrcTable | TimeStr | Value |
|--------------|----------------------|-------|
| batchweight | 2017-09-29T12:46:19Z | 38985 |
| batch_number | 2017-09-29T12:46:18Z | 5522 |
| batch_number | 2017-09-29T12:25:33Z | 5521 |
| batch_number | 2017-09-29T11:44:45Z | 5520 |
| ponumber | 2017-09-28T10:47:55Z | 0 |
关于mysql - 条件SQL查询协助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46495242/
目前我正在构建相当大的网络系统,我需要强大的 SQL 数据库解决方案。我选择 Mysql 而不是 Postgres,因为一些任务需要只读(MyISAM 引擎)而其他任务需要大量写入(InnoDB)。
我在 mysql 中使用如下命令。当它显示表格数据时,它被格式化为一个非常干净的表格,间距均匀且 |作为列分隔符。 SELECT * FROM TABLE_NAME; 当我从 CLI 运行命令时,如下
我知道这个问题之前已经被问过好几次了,我已经解决了很多问题,但到目前为止没有任何效果。 MySQL 试图将自身安装到的目录 (usr/local/mysql) 肯定有问题。关于我的错误的奇怪之处在于我
以下是我的 SQL 数据结构,我正在尝试如下两个查询: Select Wrk_ID, Wrk_LastName, Skill_Desc from Worker, Skill where
我们有一个本地 mysql 服务器(不在公共(public)域上),并希望将该服务器复制到我们拥有的 google 云 sql 实例。我的问题是:1.这可能吗?2.我们的本地服务器只能在本地网络上访问
我有一个表(test_table),其中一些字段值(例如字段 A、B 和 C)是从外部应用程序插入的,还有一个字段(字段 D),我想从现有表(store_table)插入其值,但在插入前者(A、B 和
我想创建一个 AWS RDS 实例,然后使用 terraform 管理数据库用户。因此,首先,我创建了一个 RDS 实例,然后使用创建的 RDS 实例初始化 mysql 提供程序,以进一步将其用于用户
当用户在我的网站上注册时,他们会在我的一个数据库中创建自己的表格。该表存储用户发布的所有帖子。我还想做的是也为他们生成自己的 MySql 用户——该用户仅有权从他们的表中读取、写入和删除。 创建它应该
我有一个关于 ColdFusion 和 Mysql 的问题。我有两个表:PRODUCT 和 PRODUCT_CAT。我想列出包含一些标记为:IS_EXTRANET=1 的特殊产品的类别。所以我写了这个
我想获取 recipes_id 列的值,以获取包含 ingredient_id 的 2,17 和 26 条目的值。 假设 ingredient_id 2 丢失则不获取记录。 我已经尝试过 IN 运算符
在 Ubuntu 中,我通常安装两者,但 MySQL 的客户端和服务器之间有什么区别。 作为奖励,当一个新语句提到它需要 MySQL 5.x 时,它是指客户端、服务器还是两者兼而有之。例如这个链接ht
我重新访问了我的数据库并注意到我有一些 INT 类型的主键。 这还不够独特,所以我想我会有一个指导。 我来自微软 sql 背景,在 ssms 中你可以 选择类型为“uniqeidentifier”并自
我的系统上有 MySQL,我正在尝试确定它是 Oracle MySQL 还是 MySQL。 Oracle MySQL 有区别吗: http://www.oracle.com/us/products/m
我是在生产 MySQL 中运行的应用程序的新维护者。之前的维护者已经离开,留下的文档很少,而且联系不上了。 我面临的问题是执行以下请求大约需要 10 秒: SELECT COUNT(*) FROM `
我有两个位于不同机器上的 MySQL 数据库。我想自动将数据从一台服务器传输到另一台服务器。比方说,我希望每天早上 4:00 进行数据传输。 可以吗?是否有任何 MySQL 内置功能可以让我们做到这一
有什么方法可以使用 jdbc 查询位于 mysql 根目录之外的目录中的 mysql 表,还是必须将它们移动到 mysql 根目录内的数据库文件夹中?我在 Google 上搜索时没有找到任何东西。 最
我在 mysql 数据库中有两个表。成员和 ClassNumbers。两个表都有一个付费年份字段,都有一个代码字段。我想用代码数字表中的值更新成员表中的付费年份,其中成员中的代码与 ClassNumb
情况:我有 2 台服务器,其中一台当前托管一个实时 WordPress 站点,我希望能够将该站点转移到另一台服务器,以防第一台服务器出现故障。传输源文件很容易;传输数据库是我需要弄清楚如何做的。两台服
Phpmyadmin 有一个功能是“复制数据库到”..有没有mysql查询来写这个函数?类似于将 db A 复制到新的 db B。 最佳答案 首先创建复制数据库: CREATE DATABASE du
我有一个使用 mySQL 作为后端的库存软件。我已经在我的计算机上对其进行了测试,并且运行良好。 当我在计算机上安装我的软件时,我必须执行以下步骤: 安装 mySQL 服务器 将用户名指定为“root
我是一名优秀的程序员,十分优秀!