Php 左连接中的时间-MYSQL
我试图生成一个具有稳定时间线的动态图表,因此我需要在x轴上添加额外的时间(分钟)。 我需要两列。第1列(时间)显示了一个表中一天中的每一分钟,该表只列出了从00:00到23:59的时间列(示例表只有20分钟)。我正试图将其与“log”表中的结果结合起来。查询将筛选我正在查看的计算机“名称”,例如计算机“名称”“1”。然后从“TimeMins”表中列出该机器何时改变状态以及1440分钟。我希望这有帮助?Php 左连接中的时间-MYSQL,php,mysql,Php,Mysql,我试图生成一个具有稳定时间线的动态图表,因此我需要在x轴上添加额外的时间(分钟)。 我需要两列。第1列(时间)显示了一个表中一天中的每一分钟,该表只列出了从00:00到23:59的时间列(示例表只有20分钟)。我正试图将其与“log”表中的结果结合起来。查询将筛选我正在查看的计算机“名称”,例如计算机“名称”“1”。然后从“TimeMins”表中列出该机器何时改变状态以及1440分钟。我希望这有帮助? 最后,我有一个动态图表,它显示了机器一整天的状态变化。“时间”列将设置图形的x轴,给出稳定的时
最后,我有一个动态图表,它显示了机器一整天的状态变化。“时间”列将设置图形的x轴,给出稳定的时间线 不幸的是,我不能让它正确地加入。也许有别的办法或者有人能解决这个问题吗 结果应该与……相似
time state
00:00 null (or zero)
00:01 null
00:02 1
00:03 null
00:04 null
00:05 0
00:06 null
00:07 1
等。一天中每分钟的值,无论该分钟的“日志”中是否有结果
非常感谢。这已经有两天多了
以下是SQLfiddle:
谢谢。
杰米。您可以使用内部选择 在下面的示例中,我使用了3
select name, beginning, ending - beginning as seconds from (
select a.name, a.ts as beginning, (
select min(b.ts)
from log b
where b.ts > a.ts and a.name = b.name and b.state = 0
) as ending
from log a
where a.state = 1
) c
order by beginning;
第二是为每台机器提供起点和终点
第一个是包装第二个,它只是计算每次运行的秒数,并按开始对结果进行排序
当机器在a.ts启动后停止时,第三个正在尝试查找下一行,并使用相同的名称状态0(以匹配相同的机器)
我并不主张将此作为一种解决方案(即使使用此方法,也肯定会有更好的方法编写此查询),但仅作为说明
DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(16) DEFAULT NULL,
`ts` datetime NOT NULL,
`state` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `log` VALUES
(20,1,'2016-05-16 00:03:02',1),
(21,1,'2016-05-16 00:04:03',0),
(22,2,'2016-05-16 00:04:28',1),
(23,2,'2016-05-16 00:06:45',0),
(25,1,'2016-05-16 00:14:50',1),
(26,2,'2016-05-16 00:15:35',1);
DROP TABLE IF EXISTS `TimeMins`;
CREATE TABLE `TimeMins` (
t time PRIMARY KEY
);
INSERT INTO `TimeMins` VALUES
('00:00:00'),
('00:01:00'),
('00:02:00'),
('00:03:00'),
('00:04:00'),
('00:05:00'),
('00:06:00'),
('00:07:00'),
('00:08:00'),
('00:09:00'),
('00:10:00'),
('00:11:00'),
('00:12:00'),
('00:13:00'),
('00:14:00'),
('00:15:00'),
('00:16:00'),
('00:17:00'),
('00:18:00'),
('00:19:00'),
('00:20:00');
SELECT a.*
, b.id
, b.name
, b.state
FROM
( SELECT DISTINCT CONCAT(DATE(l.ts),' ',t.t) i
FROM log l
, timemins t
) a
LEFT
JOIN log b
ON DATE_FORMAT(b.ts,'%Y%m%d%h%i') = DATE_FORMAT(a.i,'%Y%m%d%h%i');
+---------------------+------+------+-------+
| i | id | name | state |
+---------------------+------+------+-------+
| 2016-05-16 00:00:00 | NULL | NULL | NULL |
| 2016-05-16 00:01:00 | NULL | NULL | NULL |
| 2016-05-16 00:02:00 | NULL | NULL | NULL |
| 2016-05-16 00:03:00 | 20 | 1 | 1 |
| 2016-05-16 00:04:00 | 21 | 1 | 0 |
| 2016-05-16 00:04:00 | 22 | 2 | 1 |
| 2016-05-16 00:05:00 | NULL | NULL | NULL |
| 2016-05-16 00:06:00 | 23 | 2 | 0 |
| 2016-05-16 00:07:00 | NULL | NULL | NULL |
| 2016-05-16 00:08:00 | NULL | NULL | NULL |
| 2016-05-16 00:09:00 | NULL | NULL | NULL |
| 2016-05-16 00:10:00 | NULL | NULL | NULL |
| 2016-05-16 00:11:00 | NULL | NULL | NULL |
| 2016-05-16 00:12:00 | NULL | NULL | NULL |
| 2016-05-16 00:13:00 | NULL | NULL | NULL |
| 2016-05-16 00:14:00 | 25 | 1 | 1 |
| 2016-05-16 00:15:00 | 26 | 2 | 1 |
| 2016-05-16 00:16:00 | NULL | NULL | NULL |
| 2016-05-16 00:17:00 | NULL | NULL | NULL |
| 2016-05-16 00:18:00 | NULL | NULL | NULL |
| 2016-05-16 00:19:00 | NULL | NULL | NULL |
| 2016-05-16 00:20:00 | NULL | NULL | NULL |
+---------------------+------+------+-------+
我编辑了,但页面没有更新我的写作方式。2列。”“时间”和“状态”。谢谢。请看下面我的补充评论。非常感谢你的帮助,很公平。已经编辑过了,谢谢。这是一个简单的左连接-但是你真的不需要这个实用程序表。处理php循环中丢失结果的逻辑会更快更简单。谢谢。这里有人想帮我吗?虽然很简单,但我无法解决。PHP循环不起作用,因为我需要它为我的图表生成xml。谢谢Richard,但这不是我想要做的。我拙劣的解释。我需要两列。第1列(时间)显示了一天中的每一分钟,该表只列出了从00:00到23:59的时间列。我正试图将其与“log”表中的结果结合起来。该查询将过滤我正在查看的机器“名称”,例如“1”。然后从“TimeMins”表中列出该机器何时改变状态以及1440分钟。我希望这能有所帮助?最终,我有一个动态图表,显示一台机器一整天的状态变化。“时间”列将设置图表的x轴,给出一个稳定的时间轴。谢谢,但您的解决方案似乎没有在结果表上给出结果。两次连接的时间间隔有几分钟。草莓,非常接近,但结果不符合时间顺序。它显示00:03:00作为第一行,但00:00:00应该在开始处。我确实试图按时间顺序更改您的代码,但无法更改。你能再看看吗。谢谢。好吧,也许我会在九月份给你回电话;-)
DROP TABLE IF EXISTS `log`;
CREATE TABLE `log` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(16) DEFAULT NULL,
`ts` datetime NOT NULL,
`state` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
);
INSERT INTO `log` VALUES
(20,1,'2016-05-16 00:03:02',1),
(21,1,'2016-05-16 00:04:03',0),
(22,2,'2016-05-16 00:04:28',1),
(23,2,'2016-05-16 00:06:45',0),
(25,1,'2016-05-16 00:14:50',1),
(26,2,'2016-05-16 00:15:35',1);
DROP TABLE IF EXISTS `TimeMins`;
CREATE TABLE `TimeMins` (
t time PRIMARY KEY
);
INSERT INTO `TimeMins` VALUES
('00:00:00'),
('00:01:00'),
('00:02:00'),
('00:03:00'),
('00:04:00'),
('00:05:00'),
('00:06:00'),
('00:07:00'),
('00:08:00'),
('00:09:00'),
('00:10:00'),
('00:11:00'),
('00:12:00'),
('00:13:00'),
('00:14:00'),
('00:15:00'),
('00:16:00'),
('00:17:00'),
('00:18:00'),
('00:19:00'),
('00:20:00');
SELECT a.*
, b.id
, b.name
, b.state
FROM
( SELECT DISTINCT CONCAT(DATE(l.ts),' ',t.t) i
FROM log l
, timemins t
) a
LEFT
JOIN log b
ON DATE_FORMAT(b.ts,'%Y%m%d%h%i') = DATE_FORMAT(a.i,'%Y%m%d%h%i');
+---------------------+------+------+-------+
| i | id | name | state |
+---------------------+------+------+-------+
| 2016-05-16 00:00:00 | NULL | NULL | NULL |
| 2016-05-16 00:01:00 | NULL | NULL | NULL |
| 2016-05-16 00:02:00 | NULL | NULL | NULL |
| 2016-05-16 00:03:00 | 20 | 1 | 1 |
| 2016-05-16 00:04:00 | 21 | 1 | 0 |
| 2016-05-16 00:04:00 | 22 | 2 | 1 |
| 2016-05-16 00:05:00 | NULL | NULL | NULL |
| 2016-05-16 00:06:00 | 23 | 2 | 0 |
| 2016-05-16 00:07:00 | NULL | NULL | NULL |
| 2016-05-16 00:08:00 | NULL | NULL | NULL |
| 2016-05-16 00:09:00 | NULL | NULL | NULL |
| 2016-05-16 00:10:00 | NULL | NULL | NULL |
| 2016-05-16 00:11:00 | NULL | NULL | NULL |
| 2016-05-16 00:12:00 | NULL | NULL | NULL |
| 2016-05-16 00:13:00 | NULL | NULL | NULL |
| 2016-05-16 00:14:00 | 25 | 1 | 1 |
| 2016-05-16 00:15:00 | 26 | 2 | 1 |
| 2016-05-16 00:16:00 | NULL | NULL | NULL |
| 2016-05-16 00:17:00 | NULL | NULL | NULL |
| 2016-05-16 00:18:00 | NULL | NULL | NULL |
| 2016-05-16 00:19:00 | NULL | NULL | NULL |
| 2016-05-16 00:20:00 | NULL | NULL | NULL |
+---------------------+------+------+-------+