基于上一个和下一个值的mysql查询

基于上一个和下一个值的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,

我有下表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, 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;