Mysql SQL:可以用更好的方法解决吗?

Mysql SQL:可以用更好的方法解决吗?,mysql,sql,Mysql,Sql,我确信它可以这样问: 所以 有一个简单的日志表: CREATE TABLE `log` ( `id` int(11) NOT NULL, << AUTOINC `action` int(11) NOT NULL DEFAULT '0', `source` varchar(20) , `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, `message` varchar(100) ) ; 正如您所看到的,

我确信它可以这样问:

所以

有一个简单的日志表:

CREATE TABLE `log` (
  `id` int(11) NOT NULL,  << AUTOINC
  `action` int(11) NOT NULL DEFAULT '0',
  `source` varchar(20) ,
  `time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
  `message` varchar(100) 
) ;
正如您所看到的,传感器每分钟都在被读取,并在“消息”列中提供几乎相同的值

关键是,我必须更改表布局,使其在一行中包含两条“消息”,并用第一次传感器读取时间标记时间戳

所以结果应该是这样的:

2015-06-04 23:28:03     24437 24375
2015-06-04 23:27:03     24437 24375
2015-06-04 23:26:03     24437 24375
etc
我似乎找到了解决办法,但看起来很糟糕:

SELECT l1.time as l1time,l1.message as l1mess , l2.message as l2mess, 
FROM log l1,log l2 
WHERE l1.source LIKE 'TEMP_10%' AND l2.source LIKE 'TEMP_28%' 
AND l2.id-l1.id=1 AND l1.action=3 AND l2.action=3 
AND ABS(TIMESTAMPDIFF(SECOND,l2.time,l1.time))<10;

当然,还有更好的解决方案……

这很好,语法更清晰,我认为效率更高:

select q0.`time`, q0.`message`, q1.`message` from
( select `id`, `time`, `message` from `log` where `source` = 'TEMP_10-000802b59f3f'
) as q0
,
( select `id`, `time`, `message` from `log` where `source` = 'TEMP_28-021501c7b0ff'
  ) as q1
where 
ABS(TIMESTAMPDIFF(SECOND,q0.`time`,q1.`time`))<10
and abs(q0.`id`-q1.`id`)=1;
请注意,如果我们可以使用= 如果action=3筛选器始终为true,则不要使用它,否则,将其放入内部查询q0和q1中
这是一个实时的

您的查询格式更好:

SELECT l1.time as l1time,l1.message as l1mess, l2.message as l2mess, 
FROM log l1 JOIN
     log l2 
     ON l1.source LIKE 'TEMP_10%' AND l2.source LIKE 'TEMP_28%' AND
        l2.id - l1.id = 1 AND l1.action = 3 AND l2.action = 3 ABD
        ABS(TIMESTAMPDIFF(SECOND,l2.time, l1.time)) < 10;

我不是100%确定这真的能满足你的需要。但是您确实声称此查询适合您。

您可以将逻辑移动到两个视图中,从而稍微清理一下。也许是CHARINDEX而不是like。您没有提供足够的信息来给出完整的答案。每次轮询传感器的顺序是否相同?您需要适应什么级别的抖动?您是否能够修改控制轮询的代码?而且,最重要的是,您认为更好的标准是什么?是的,它们以相同的顺序进行轮询,但是它们的计数和名称可以更改连接到总线的系统轮询。是的,我可以更改插入代码,但要记住,日志包含了其他来源的数据,这里没有显示,因此,仅针对该问题再增加一列就要多出两列。更好意味着更好的SQL语法和更快的结果:你说的更好是什么意思?更可读的代码,更快的响应,或者其他什么?正如上面所写的,这意味着更干净的SQL语法和更低的CPU负载…看起来更好:只需添加final'和q1.id-q0.id=1';要消除重复项并确保配对正确。在MySQL中使用子查询几乎排除了优化查询的任何可能性。@GordonLinoff这个问题是这样的吗?@54l3d。是的,条件可以放在WHERE或ON子句中,而不需要子查询。@54l3d进行了更多的测试,结果集似乎有点错误。结果行数似乎是源的25%,而它应该是50%+-1行。这里你有更大的数据集测试,它似乎工作@SteveCav说CHARINDEX也将是一个改进..@PaulPaku。事实并非如此。如果索引可用,SQL Server将像“TEMP_10%”一样进行优化。无法优化CHARINDEX。
SELECT l1.time as l1time,l1.message as l1mess, l2.message as l2mess, 
FROM log l1 JOIN
     log l2 
     ON l1.source LIKE 'TEMP_10%' AND l2.source LIKE 'TEMP_28%' AND
        l2.id - l1.id = 1 AND l1.action = 3 AND l2.action = 3 ABD
        ABS(TIMESTAMPDIFF(SECOND,l2.time, l1.time)) < 10;
     ON l1.source LIKE 'TEMP_10%' AND l2.source LIKE 'TEMP_28%' AND
        l2.id = l1.id + 1 AND l1.action = 3 AND l2.action = 3 ABD
        ABS(TIMESTAMPDIFF(SECOND, l2.time, l1.time)) < 10;