基于上一个和下一个值的mysql查询
我有下表test1基于上一个和下一个值的mysql查询,mysql,sql,mysqli,phpmyadmin,mysql-workbench,Mysql,Sql,Mysqli,Phpmyadmin,Mysql Workbench,我有下表test1 -- auto-generated definition CREATE TABLE test1 ( imei VARCHAR(10) DEFAULT '1' NULL, id INT(6) UNSIGNED AUTO_INCREMENT PRIMARY KEY, lat FLOAT(10, 5) NOT NULL, lng FLOAT(10,
-- auto-generated definition
CREATE TABLE test1
(
imei VARCHAR(10) DEFAULT '1' NULL,
id INT(6) UNSIGNED AUTO_INCREMENT
PRIMARY KEY,
lat FLOAT(10, 5) NOT NULL,
lng FLOAT(10, 5) NOT NULL,
ign CHAR NULL,
datetime TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ON UPDATE CURRENT_TIMESTAMP
)
ENGINE = InnoDB;
有以下数据
INSERT INTO test1 (imei, id, lat, lng, ign, datetime) VALUES ('1', 1, 27.1, 28.2, '0', '2018-04-18 02:15:25');
INSERT INTO test1 (imei, id, lat, lng, ign, datetime) VALUES ('1', 2, 27.2, 28.2, '1', '2018-04-18 02:16:59');
INSERT INTO test1 (imei, id, lat, lng, ign, datetime) VALUES ('1', 3, 27.3, 28.4, '1', '2018-04-18 02:17:59');
INSERT INTO test1 (imei, id, lat, lng, ign, datetime) VALUES ('1', 4, 27.4, 28.5, '0', '2018-04-18 02:18:59');
INSERT INTO test1 (imei, id, lat, lng, ign, datetime) VALUES ('1', 1, 27.1, 28.2, '0', '2018-04-18 02:25:25');
INSERT INTO test1 (imei, id, lat, lng, ign, datetime) VALUES ('1', 2, 27.2, 28.2, '1', '2018-04-18 02:26:59');
INSERT INTO test1 (imei, id, lat, lng, ign, datetime) VALUES ('1', 3, 27.3, 28.4, '1', '2018-04-18 02:27:59');
INSERT INTO test1 (imei, id, lat, lng, ign, datetime) VALUES ('1', 4, 27.4, 28.5, '0', '2018-04-18 02:28:59');
逻辑如下:
ign
列;如果该值为1(表示点火打开),则它将生成第一部分:imei lat lng status datetime
ign
列,如果值为0(点火关闭),那么它将生成第二部分:imei lat lng status datetime
SELECT test1.imei, test1.lat, test1.lng ,
MAX(CASE WHEN test1.ign = 1 THEN 'ign on' END) as IgnOn,
min(CASE WHEN test1.ign = 0 THEN 'ign of' END) as IgnOff
FROM test1 GROUP BY test1.imei, test1.lat, test1.lng;
select *,
if(test1.ign = 1, 'ign on', 'ign off') as status,
CASE
WHEN test1.ign = 1 THEN @a := 0
ELSE @a := 1
END as mycondition
from test1
WHERE test1.imei = 1
HAVING test1.ign = @a
ORDER BY reg_date ASC;
经过多次搜索,我可以创建此查询
SELECT test1.imei, test1.lat, test1.lng ,
MAX(CASE WHEN test1.ign = 1 THEN 'ign on' END) as IgnOn,
min(CASE WHEN test1.ign = 0 THEN 'ign of' END) as IgnOff
FROM test1 GROUP BY test1.imei, test1.lat, test1.lng;
select *,
if(test1.ign = 1, 'ign on', 'ign off') as status,
CASE
WHEN test1.ign = 1 THEN @a := 0
ELSE @a := 1
END as mycondition
from test1
WHERE test1.imei = 1
HAVING test1.ign = @a
ORDER BY reg_date ASC;
这就是我需要的结果:
imei i1lat i1lng i1status i0datetime i0lat ign1lng i1status i1datetime
1 27.2 28.2 1 2018-04-18 02:16:59 27.4 28.5 0 2018-04-18 02:18:59
1 27.2 28.2 1 2018-04-18 02:26:59 27.4 28.5 0 2018-04-18 02:28:59
我可以编写一个php脚本,生成我想要的数据,但我想使用mysql生成相同的数据。@MuhammadMemon请在你的问题中发布它,它会被格式化,我们可以更好地阅读。我已经更新了我的查询,你们可以检查一下吗。“经过多次搜索,我可以创建这个查询”这有什么问题吗?具体来说,它不能满足您的要求吗?是的,有一些方法,但该查询是可接受的欢迎使用堆栈溢出!感谢您提供此代码片段,它可能会提供一些有限的短期帮助。通过说明为什么这是一个很好的问题解决方案来正确解释它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在您的回答中添加一些解释,包括您所做的假设。
select *,
if(test1.ign = 1, 'ign on', 'ign off') as status,
CASE
WHEN test1.ign = 1 THEN @a := 0
ELSE @a := 1
END as mycondition
from test1
WHERE test1.imei = 1
HAVING test1.ign = @a
ORDER BY reg_date ASC;